1
Immortal 2019-10-30 18:18:37 +08:00 via Android
爸爸给第一个小孩起名叫“小明”
第二个孩子也叫“小明” 两个小孩都叫“小明” 但是两个不同的人(载体) |
2
Cooky 2019-10-30 18:19:38 +08:00 via Android
输出的是变量自身的地址?那肯定不一样吧
没学过 go,盲猜 |
3
dosmlp 2019-10-30 18:21:16 +08:00
因为那是两个变量啊
|
4
95aluo 2019-10-30 18:23:16 +08:00
这得看你的语言基础了,Go 语言是基于 C 语言的,可以看一下 C 语言变量地址相关知识
|
5
ahsjs 2019-10-30 18:23:56 +08:00
y:=x 有值拷贝了,换成 y:=&x 用*y 指针访问就一样了。
|
6
javapythongo 2019-10-30 18:35:48 +08:00 1
slice 是由三个字段组成的,*data、length、cap,只有 data 数组是引用同一个指针,但是 length、cap 并不是,所以 y:=x 是两个 slice,只是*data 是同一个指针
|
7
catror 2019-10-30 18:35:59 +08:00 via Android 1
Go 里面有个玩意儿叫 Slice,这里 x 和 y 都是 Slice,同时引用你 make 出来的数组。这里取地址取到的是 Slice 的地址。
|
11
wangkai0351 2019-10-30 19:13:33 +08:00
这就是我反对不学 C 的原因
|
12
gramyang OP @wangkai0351 这和 C 还真没什么关系,go 里面没有引用传递,都是值传递
|
13
reus 2019-10-30 21:09:46 +08:00
@gramyang 你这里都没有函数调用,和值传递引用传递有什么关系?如果你懂 C,当然会知道 x 和 y 是不同的变量,不同的变量自然有不同的地址。
|
14
unionx 2019-10-30 22:34:56 +08:00
这就是我反对不学 C 的原因
|
16
justfly 2019-10-31 10:20:21 +08:00
上边太复杂了,还涉及不到 slice 的实现,这就相当于:
var a []int var b []int 你比较 a b 俩变量的地址,当然是不一样的。 |
17
merin96 2019-10-31 10:57:20 +08:00
x := make([]int, 3)
fmt.Printf("%p\n", &x[0]) y := x fmt.Printf("%p\n", &y[0]) |
18
merin96 2019-10-31 10:57:35 +08:00
|
19
BinGo1994 2019-10-31 11:18:31 +08:00
切片是引用类型,X,Y 是不同的变量,但是指向同一段内存地址
|
20
welkim 2019-10-31 11:29:21 +08:00
你造了个房间,里面放了一些东西,开了一扇门,然后又开了一扇门,两扇门是不一样的,但是都能进到房间里,看到一样的东西。
|
21
TypeErrorNone 2019-10-31 11:39:37 +08:00
y 和 x 都是指针变量,指向同一个地址 make([]int, 3)
|