Pointers golang中嵌入类型的内部状态-它是如何工作的?

Pointers golang中嵌入类型的内部状态-它是如何工作的?,pointers,go,methods,struct,embedding,Pointers,Go,Methods,Struct,Embedding,我正试图将我的头脑集中在嵌入golang上,当涉及到嵌入到另一个中的类型的状态时,我有点困惑 我的问题是:如果我有一个int类型Embedii,并且它有一个影响其值的方法,那么它应该出现在嵌入它的类型中吗 以下是我玩的东西: 主程序包 进口( “fmt” ) II型嵌入式int func(y*ii)Do(){ 如果y==nil{ y=新(II) }否则{ *y=*y+1 } 格式打印项次(*y) } 类型嵌入器结构{ *嵌入 } func main(){ 嵌入II:=新的(嵌入II) embed

我正试图将我的头脑集中在嵌入golang上,当涉及到嵌入到另一个中的类型的状态时,我有点困惑

我的问题是:如果我有一个int类型
Embedii
,并且它有一个影响其值的方法,那么它应该出现在嵌入它的类型中吗

以下是我玩的东西:

主程序包
进口(
“fmt”
)
II型嵌入式int
func(y*ii)Do(){
如果y==nil{
y=新(II)
}否则{
*y=*y+1
}
格式打印项次(*y)
}
类型嵌入器结构{
*嵌入
}
func main(){
嵌入II:=新的(嵌入II)
embedii.Do()//打印1
embedii.Do()//打印2
格式打印项次(“--”)
嵌入器:=新的(嵌入器)
embedder.Do()//打印0
embedder.Do()//打印0
格式打印项次(“--”)
nembedii:=新的(嵌入式II)
嵌入器:=&Embedder{nembedii}
embedo.Do()//打印1
embedo.Do()//打印2
}

我很想知道为什么我必须显式地将
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
输出将是(在上尝试):


“它应该出现在嵌入它的类型中吗?”是的,它应该出现,因为它是结构中的另一个类型。

如果y==nil{y=new(Embedii)}
可能不会像您认为的那样。不要在Go中编写Java代码。这并不能真正解决您的问题,但这将实现所有三个变量的预期增量;-很确定你的问题就是沃尔克提到的。无法确定,但可能与将内存地址重新映射到新指针有关。@Mikey这很有趣,现在我好奇的是
Embedii
(使用指针引用定义)的方法是如何实现的即使接收器是指针并且
Embedii
包含在
Embedder
结构中而不包含
*
,也会添加到
Embedder
1
2
---
0
1
---
1
2