2017-03-06 112 views
-1

我想在Golang中阐明这种行为, 为什么当你在数组上使用内存引用,并且改变这个引用的值时,引用数组中没有任何变化。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” 是不存在的。

方法打印类型

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) 
} 

回答

-1

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

1

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

不,它不分配任何东西。

var t [5]int是一个值。请注意,根据规格[5]int如果在这种情况下全名类型。你可以把它看作一个带有5 int字段的结构体。行x := *p使取消引用指向t(值)。赋值会创建它的一个副本。如果你想通过一个“参考”t作它的片段:t[:]