gpt4 book ai didi

arrays - Golang 数组指针

转载 作者:数据小太阳 更新时间:2023-10-29 03:35:21 25 4
gpt4 key购买 nike

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

最佳答案

Okay found it, the operator ":=" allocate an new memory address.

不,它不分配任何东西。

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

关于arrays - Golang 数组指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42623535/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com