【发布时间】:2020-03-10 12:33:36
【问题描述】:
我正试图将我的头脑围绕在 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 类型才能正常工作
【问题讨论】:
-
if y == nil { y = new(Embedii) }可能不会像您认为的那样做。不要在 Go 中编写 Javacode。 -
并不能真正解决您的问题,但这将实现所有三个变体按预期递增; play.golang.org/p/3aUC412mwsm - 很确定你的问题就是沃尔克提到的。不能肯定地说,但可能与将内存地址重新映射到新指针有关。
-
@Mikey 这很有趣,现在我很好奇的是
Embedii的方法(使用指针引用定义)如何添加到Embedder中,即使接收者是一个指针和Embedii包含在没有*的Embedder结构中。
标签: pointers go methods struct embedding