根据 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
的顺序也被改变了。
请各位大神指出我哪里理解错了。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.