问一个特别基本的问题。。。。

2019 年 10 月 30 日
 gramyang
x := make([]int, 3)
fmt.Printf("%p\n", &x) //不变 0xc000004480
//y := make([]int, 3)
y := x
fmt.Printf("%p\n", &y) //不变 0xc0000044c0
x[0] = 1
fmt.Println(x) //[1 0 0]
fmt.Println(y) //[1 0 0]

问题:为啥 x 和 y 的地址不一样。。。
4938 次点击
所在节点    Go 编程语言
21 条回复
Immortal
2019 年 10 月 30 日
爸爸给第一个小孩起名叫“小明”
第二个孩子也叫“小明”
两个小孩都叫“小明”
但是两个不同的人(载体)
Cooky
2019 年 10 月 30 日
输出的是变量自身的地址?那肯定不一样吧
没学过 go,盲猜
dosmlp
2019 年 10 月 30 日
因为那是两个变量啊
95aluo
2019 年 10 月 30 日
这得看你的语言基础了,Go 语言是基于 C 语言的,可以看一下 C 语言变量地址相关知识
ahsjs
2019 年 10 月 30 日
y:=x 有值拷贝了,换成 y:=&x 用*y 指针访问就一样了。
javapythongo
2019 年 10 月 30 日
slice 是由三个字段组成的,*data、length、cap,只有 data 数组是引用同一个指针,但是 length、cap 并不是,所以 y:=x 是两个 slice,只是*data 是同一个指针
catror
2019 年 10 月 30 日
Go 里面有个玩意儿叫 Slice,这里 x 和 y 都是 Slice,同时引用你 make 出来的数组。这里取地址取到的是 Slice 的地址。
gramyang
2019 年 10 月 30 日
@ahsjs 照你的方法解决了

请教一下,y := x 值拷贝,x 和 y 的地址不一样,是如何指向同一个切片的呢?
zarte
2019 年 10 月 30 日
@gramyang #6 是正经 的解释。
gramyang
2019 年 10 月 30 日
@zarte 明白了! x 和 y 不是同一个切片,但是底层数组是一样的,另外 go 里面只有值传递
wangkai0351
2019 年 10 月 30 日
这就是我反对不学 C 的原因
gramyang
2019 年 10 月 30 日
@wangkai0351 这和 C 还真没什么关系,go 里面没有引用传递,都是值传递
reus
2019 年 10 月 30 日
@gramyang 你这里都没有函数调用,和值传递引用传递有什么关系?如果你懂 C,当然会知道 x 和 y 是不同的变量,不同的变量自然有不同的地址。
unionx
2019 年 10 月 30 日
这就是我反对不学 C 的原因
zarte
2019 年 10 月 31 日
@gramyang 错啦,切片是默认是引用的。
justfly
2019 年 10 月 31 日
上边太复杂了,还涉及不到 slice 的实现,这就相当于:

var a []int
var b []int

你比较 a b 俩变量的地址,当然是不一样的。
merin96
2019 年 10 月 31 日
x := make([]int, 3)
fmt.Printf("%p\n", &x[0])
y := x
fmt.Printf("%p\n", &y[0])
merin96
2019 年 10 月 31 日
BinGo1994
2019 年 10 月 31 日
切片是引用类型,X,Y 是不同的变量,但是指向同一段内存地址
welkim
2019 年 10 月 31 日
你造了个房间,里面放了一些东西,开了一扇门,然后又开了一扇门,两扇门是不一样的,但是都能进到房间里,看到一样的东西。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://study.congcong.us/t/614573

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX