gpt4 book ai didi

go - 如何通过嵌入式接口(interface)嵌入结构值 : Composable Structs

转载 作者:IT王子 更新时间:2023-10-29 01:42:17 25 4
gpt4 key购买 nike

这个问题最好用一个例子来描述

http://play.golang.org/p/bQuRr0kV-b

我正在尝试制作一个可组合的结构。在此示例中,我想要一个 Person 类型,其中嵌入了 Female 或 Male 的值。如果我只是处理结构,我会像这样嵌入它们

type Person Struct{
Female
Male
}

但是我不能这样做,因为在实际项目中,有很多嵌入式结构,我更愿意保持结构干净和可组合。但也存在命名冲突——在此示例中,Male 和 Female 都包含字段“Eyes”。将冲突的值移动到 Person 结构不是一个可行的解决方案(因为许多其他嵌入式结构不包含该特定值)。

我希望通过一个简单的界面传递这些值。下面的示例:运行此代码时,我得到 &{Name: Age:0 Type:male GenderType:0x10434120} 其中 GenderType 是指向 Male 结构的指针(在本例中)。我的目标是返回一个平面结构,看起来像 &{Name: Age:0 Type:male Eyes: ChestSize:0}

package main

import "fmt"

type Person struct {
Name string
Age int
Type string
GenderType
}

type GenderType interface {
TypeName() string
}

type Male struct {
Eyes string
ChestSize int
}

type Female struct {
Eyes string
BustSize int
}

func (m *Male) TypeName() string {
return "male"
}

func (f *Female) TypeName() string {
return "female"
}

func main() {

d := NewHuman(new(Male))
fmt.Printf("%+v", d)
}

func NewHuman(gt GenderType) *Person {
return &Person{
Type: gt.TypeName(),
GenderType: gt,

}
}

最佳答案

我认为不可能在平面结构中执行此操作,因为这将需要在运行时更改结构类型的内存结构,而这是不允许的。虽然您可以使用 GenderType 访问嵌入式字段,但它仍然是允许的,因为您说这将是对满足接口(interface)的嵌入式结构的引用,而不是更改结构本身的结构。

我认为使用它编码为平面 json 的更好方法是保留您的嵌入式结构,然后使 Person 结构成为 Marshaler

您可以添加自己的自定义 MarshalJSON() (byte[],error) 方法并使用它来生成平面 json 输出。

如果您需要专门的解码处理,那么您可以使用绑定(bind)到 Person 的 (UnmarshalJSON([]byte) error) 方法进行同样的操作。

参见 https://golang.org/pkg/encoding/json/#Marshaler进一步引用

这是一个展示我的意思的 Playground :https://play.golang.org/p/qOl9WSaI3O

关于go - 如何通过嵌入式接口(interface)嵌入结构值 : Composable Structs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35928047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com