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

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

这是我的问题:如果我有一个类型为dependencies { compile fileTree(dir: 'libs',include: ['*.jar']) // ... configurations.all { exclude module: 'animated-vector-drawable' } } 的整数,并且它具有影响其值的方法,应该以嵌入它的类型出现吗?

这是我在玩的东西:

Embedii

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

我很好奇为什么我必须将现有的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 } 实例显式传递给Embedii类型才能正常工作

d520y 回答:Golang中嵌入式类型的内部状态-它如何工作?

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
,

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

本文链接:https://www.f2er.com/2671469.html

大家都在问