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

我正在尝试在 golang 中嵌入,当谈到嵌入到另一个类型中的状态时,我有点困惑。


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


这是我正在玩的:


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该类型才能正常工作


翻过高山走不出你
浏览 135回答 2
2回答

千万里不及你

接收器中Embedii.Do()是一个指针值。这是一个副本。向该指针变量分配任何内容只会修改副本。y = new(Embedii)只是将一个指针分配给局部变量y,当Do()返回时,它就丢失了。当再次调用时,y会nil再次出现,因此它会创建并为其分配一个新值(返回后会再次丢失)。如果您创建Embedii先验,它会起作用,因为这样您就不会创建并分配它Do()(这会丢失)。如果您返回新的(更准确地说是它的地址)并分配它,您将看到它递增,但它将以notEmbedii开头,因为第一次调用只是创建它而不递增,而在其他情况下它已经存在,因此第一次调用立即增加:01func (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 0embedder.Embedii = embedder.Do() // prints 1输出将是(在Go Playground上尝试):12---01---12

湖上湖

“它应该出现在嵌入它的类型中吗?” 是的,它应该,因为它是结构内的另一种类型。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go