gpt4 book ai didi

pointers - Golang中嵌入式类型的内部状态-它如何工作?

转载 作者:行者123 更新时间:2023-12-01 22:31:05 26 4
gpt4 key购买 nike

我试图把头埋在golang中,在涉及嵌入另一个类型的状态时,我有些困惑。

这是我的问题:如果我的Embedii类型为int,并且具有影响其值的方法,是否应该以嵌入它的类型出现?

这是我正在玩的游戏:

package main

import (
"fmt"
)

type Embedii int

func (y *Embedii) Do() {
if y == nil {
y = new(Embedii)
} else {
*y = *y + 1
}
fmt.Println(*y)
}

type Embedder struct {
*Embedii
}

func main() {
embedii := new(Embedii)
embedii.Do() // prints 1
embedii.Do() // prints 2

fmt.Println("---")

embedder := new(Embedder)
embedder.Do() // prints 0
embedder.Do() // prints 0

fmt.Println("---")

nembedii := new(Embedii)
embedo := &Embedder{nembedii}
embedo.Do() // prints 1
embedo.Do() // prints 2
}


https://play.golang.org/p/ArqKESVWoS-

我很好奇为什么我必须显式地将 Embedii的现有实例传递给 Embedder类型,才能使其正常工作

最佳答案

Embedii.Do()中,接收者是一个指针值。是副本。给该指针变量分配任何东西只会修改副本。
y = new(Embedii)只是将指针分配给本地变量y,当Do()返回时,它会丢失。再次调用时,y将再次为nil,因此它将创建并为其分配一个新值(返回后将再次丢失)。

如果您事先创建了Embedii,它会起作用,因为那样的话您就不会在Do()中创建和分配它(这会丢失)。

如果您返回新的Embedii(更确切地说是其地址)并进行分配,则会看到它递增,但是它将以0而不是1开头,因为第一个调用只是创建它而不递增,而在其他情况下它已经存在,并且因此,首次通话会立即增加:

func (y *Embedii) Do() *Embedii {
if y == nil {
y = new(Embedii)
} else {
*y = *y + 1
}
fmt.Println(*y)
return y
}

并使用它:
embedder := new(Embedder)
embedder.Embedii = embedder.Do() // prints 0
embedder.Embedii = embedder.Do() // prints 1

输出将是(在 Go Playground上尝试):
1
2
---
0
1
---
1
2

关于pointers - Golang中嵌入式类型的内部状态-它如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60617780/

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