为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 golang 上重用结构键?

如何在 golang 上重用结构键?

Go
哆啦的时光机 2022-09-05 15:30:17
有没有办法将一个结构中的键用于另一个结构?例如,我有以下结构:type Player struct {    Age       uint8      `json:"age"`    Name      string     `json:"name"`    UUID      string     `json:"uuid"`}type PlayerDynamo struct {    // I want all the keys from Player at the same level as `Salary`.    // Age       uint8      `json:"age"`    // Name      string     `json:"name"`    // UUID      string     `json:"uuid"`    Salary float32 `json:"salary"`}如何声明使用与 相同的密钥?PlayerDynamoPlayer
查看完整描述

2 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

Go支持一种称为“结构嵌入”或只是“嵌入”的独特功能,这是一种一流的组合(与大多数OOP语言提供的一流继承相比)。


嵌入允许您将一个结构嵌入到另一个结构中,以便可以引用嵌入结构的成员,就好像它们是在父结构上声明的一样:


type Player struct {

    Age       uint8      `json:"age"`

    Name      string     `json:"name"`

    UUID      string     `json:"uuid"`

}


type PlayerDynamo struct {

    Player // PlayerDynamo "embeds" Player

    Salary float32 `json:"salary"`

}

现在一个实例同时具有一个成员...PlayerDynamoPlayer


p := PlayerDynamo{}

p.Player.Name

和以下各项的嵌入字段:Player


p := PlayerDynamo{}

p.Name // Equivalent to p.Player.Name

甚至的方法也可以在 上调用 :PlayerPlayerDynamo


func (p Player) String() string {

  return fmt.Sprintf("Player %q", p.Name)

}


p := PlayerDynamo{

  Player: Player {

    Name: "Bob",

  },

}


fmt.Println(p.String()) // Player "Bob"

这与将 // 字段复制到 中并不完全相同:当您声明一个新的时,您仍然需要显式初始化嵌入式:AgeNameUUIDPlayerDynamoPlayerDynamoPlayer


p := PlayerDynamo {

  Player: Player {

    Name: "test",

    Age: 45,

  }

  Salary: 42

}

至关重要的是,结构标记被复制过来,编组到 JSON 的工作按预期工作,所有字段都显示在 .PlayerPlayerDynamo


有关实际示例,请参阅 https://play.golang.org/p/6HMrlVZzIsn。


查看完整回答
反对 回复 2022-09-05
?
九州编程

TA贡献1785条经验 获得超4个赞

使用嵌入:


type PlayerDynamo struct {

   Player

   Salary float32 `json:"salary"`

}


查看完整回答
反对 回复 2022-09-05
  • 2 回答
  • 0 关注
  • 71 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信