我想在Golang中阐明这种行为, 为什么当您在数组上获取内存引用并且更改此引用中的值时,引用数组中没有任何更改。
一个例子:
var t [5]int
printType(t,"t")
p := &t
printType(p,"p")
x := *p
x[0] = 4
printType(x,"x")
printType(p,"p")
printType(t,"t")
此代码返回
[t] Type:[5]int Kind:array Adr:%!p([5]int=[0 0 0 0 0]) Value:([0 0 0 0 0])
[p] Type:*[5]int Kind:ptr Adr:0xc4200142d0 Value:(&[0 0 0 0 0])
[x] Type:[5]int Kind:array Adr:%!p([5]int=[4 0 0 0 0]) Value:([4 0 0 0 0])
[p] Type:*[5]int Kind:ptr Adr:0xc4200142d0 Value:(&[0 0 0 0 0])
[t] Type:[5]int Kind:array Adr:%!p([5]int=[0 0 0 0 0]) Value:([0 0 0 0 0])
您可以看到内存地址相同但不存在值“4”。
方法printType
func printType(i interface {},message string) {
k := reflect.TypeOf(i).Kind().String()
fmt.Printf("[%s] Type:%T Kind:%s Adr:%[2]p Value:(%[2]v)\n",message,i,k)
}
答案 0 :(得分:2)
好的,发现它,运营商“:=”分配一个新的内存地址。
不,它没有分配任何东西。
var t [5]int
是一个值。请注意,根据规范[5]int
,在这种情况下是否为完整类型名称。您可以将其视为具有5个int
字段的结构。行x := *p
使取消引用指向t
(值)的指针。分配值会创建它的副本。如果您想将“引用”传递给t
,请将其剪切为t[:]
。
答案 1 :(得分:-1)
好的发现,运营商“:=”分配了一个新的内存地址。