gpt4 book ai didi

go - 包装结构引用

转载 作者:IT王子 更新时间:2023-10-29 02:09:36 24 4
gpt4 key购买 nike

我对指针类型结构包裹的值类型结构有点困惑。

例子:

package main

import (
"fmt"
)

type A struct {
id int
B
}

func (a *A) setId(val int) {
a.id = val
}

type B struct {
name string
}

func (b B) setNameViaValue(val string) {
b.name = val
}

func (b *B) setNameViaPointer(val string) {
b.name = val
}

func main() {
a := new(A)
a.setId(1)
a.setNameViaValue("valuename")
fmt.Println(a)
a.setNameViaPointer("pointername")
fmt.Println(a)
}

我希望通过包装 B 值类型结构的指针类型 A 结构(寻址具体内存)进行引用将设置内部值,无论使用何种类型的 B 引用 (B/*B)。这也与类型定义有关。当我这样定义它时,任何人都可以解释有什么不同吗?有没有用例场景?

type A struct {
id int
*B
}

最佳答案

为什么setNameViaValue最终没有设置名称

如果您声明一个带有值(非指针)接收器的方法,那么该方法不能“修改”接收器,因为它实际上会接收一个副本。

这就是为什么“名称”没有按照您预期的方式设置 setNameViaValue 的原因方法。

如果你想以那种方式设置B的名字,只有setNameViaPointer是一个选项。

您可以在此处详细了解方法和值接收器之间的区别:

https://tour.golang.org/methods/8

为什么实际上可以在外部结构上调用内部结构方法

那是因为您将内部结构“嵌入”了外部结构。

当你包含一个结构类型名称而不给它一个字段名称时,所有“内部”结构方法和字段都会“提升”到外部结构。

这意味着您可以调用 a.setNameViaValue这相当于做 a.B.setNameViaValue .

作为指针嵌入有什么不同吗

如果定义 A这样:

type A struct {
id int
*B
}

然后:

  • “setNameViaValue”仍然无效(这只与定义在一个值上的方法有关,而不是指针接收器,它与 A 引用 B 的方式无关)。

  • 您需要在创建 A 时显式初始化 B对象,否则 *B将最终为零。 (如果您将其作为值引用,它将被初始化为空 B )

  • 你可以改变什么*B指向稍后(如果它是一个值,那么它将始终引用相同的“值”)

关于go - 包装结构引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51214908/

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