根据 Go 文档中的例子 (链接), 如果 receiver 的类型是 *T ,那么传入的是指针;如果类型是 T, 则传入的是值的拷贝。 但是我在写代码的时候遇到一个奇怪的现象,明明我传入的是拷贝,但是函数对拷贝的操作影响到了原来的值。具体请看一面的代码:
package main
import (
"fmt"
)
type A struct {
a int
}
type Alist []*A
func (a Alist) swap(i int, j int) {
a[i], a[j] = a[j], a[i]
}
func main() {
alist := make(Alist, 2)
alist[0] = &A{a: 3}
alist[1] = &A{a: 4}
fmt.Println(alist[0], alist[1]) // 输出: &{3} &{4}
alist.swap(0, 1)
fmt.Println(alist[0], alist[1]) // 输出: &{4} &{3}
}
swap 操作应该改变a,即 alist 的复制,而不应该改变 alist 中值的顺序。但事实就是alist的顺序也被改变了。
请各位大神指出我哪里理解错了。