Golang阵列指针

时间:2017-03-06 10:44:49

标签: arrays go

我想在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)
}

2 个答案:

答案 0 :(得分:2)

  

好的,发现它,运营商“:=”分配一个新的内存地址。

不,它没有分配任何东西。

var t [5]int是一个值。请注意,根据规范[5]int,在这种情况下是否为完整类型名称。您可以将其视为具有5个int字段的结构。行x := *p使取消引用指向t(值)的指针。分配值会创建它的副本。如果您想将“引用”传递给t,请将其剪切为t[:]

答案 1 :(得分:-1)

好的发现,运营商“:=”分配了一个新的内存地址。