Pointers golang中嵌入类型的内部状态-它是如何工作的?
我正试图将我的头脑集中在嵌入golang上,当涉及到嵌入到另一个中的类型的状态时,我有点困惑 我的问题是:如果我有一个int类型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
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