登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-27 10:24:36 455浏览 收藏

Golang不知道大家是否熟悉?今天我将给大家介绍《golang 中嵌入类型的内部状态 - 它是如何工作的?》,这篇文章主要会讲到等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能积极评论指出,谢谢!希望我们能一起加油进步!

问题内容

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

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

这是我正在玩的:

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


解决方案


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

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

今天关于《golang 中嵌入类型的内部状态 - 它是如何工作的?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>