所有方法都适用于List
have *List
接收者:(http://golang.org/pkg/container/list/ http://golang.org/pkg/container/list/)
func (l *List) Back() *Element
func (l *List) Front() *Element
func (l *List) Init() *List
...
func (l *List) Remove(e *Element) interface{}
在你的例子中l
属于类型*List
,因此无需取消引用它们。
相反,假设您有这样的事情:
type A struct{}
func (a A) X() {
fmt.Println("X")
}
func (a *A) Y() {
fmt.Println("Y")
}
你可以写:
a := A{}
a.X()
a.Y() // == (&a).Y()
或者您可以执行以下操作:
a := &A{}
a.X() // same like == (*a).X()
a.Y()
但它仅适用于方法接收者。 Go 不会自动转换函数参数。鉴于这些功能:
func A(x *int) {
fmt.Println(*x)
}
func B(y int) {
fmt.Println(y)
}
这是无效的:
A(5)
你必须这样做:
var x int
A(&x)
这也是无效的:
var y *int
B(y)
你必须这样做:
B(*y)
与 C# 或 Java 不同,当涉及结构时,Go 不区分引用类型和值类型。 A*List
是一个指针,一个List
不是。修改a上的字段List
仅修改本地副本。修改a上的字段*List
修改所有“副本”。 (因为它们不是副本......它们都指向内存中的同一事物)
有些类型似乎隐藏了底层指针(比如切片包含指向数组的指针),但 Go 总是按值传递。