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

如何获取父嵌入的结构字段值?

如何获取父嵌入的结构字段值?

Go
Qyouu 2021-08-16 16:05:06
我的包中有以下结构。type Animal struct {  Id string  // and some more common fields}使用我的包的用户应该能够实现自己的Animals。正如我Id在我的一种方法中需要的那样,用户必须嵌入我的结构。type Dog struct {  Animal  Name string  Legs int}在我的包中,我有一个save()将Animals保存到数据库的函数。由于我不知道用户的类型,因此我必须将其interface{}用作参数类型。我的问题是:如何获取Id(从父结构体Animal)?目前我使用了一些 JSON 解析和解组,但这是要走的路吗?func put(doc interface{}) error {  res, err := json.Marshal(doc)  if err != nil {    return err  }  var animal *Animal  err = json.Unmarshal(res, &animal)  if err != nil {    return err  }  fmt.Println(animal.Id) // finally I have the Id  // ...}用法func main() {  bello := Dog{    Animal: Animal{      Id: "abcd1234",    },    Name: "bello",    Legs: 4,  }  err := put(bello)  // ...}
查看完整描述

3 回答

?
慕的地8271018

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

也许您可以添加一个接口以确保获得对父结构的引用:


type AnimalGetter interface {

    GetAnimal() *Animal

}


func (dog *Dog) GetAnimal() *Animal {

    return &dog.Animal

}

这将允许您的 save 方法进行类型断言(AnimalGetter):


func save(obj interface{}) {

    animal := obj.(AnimalGetter)

    fmt.Printf("%v\n", animal.GetAnimal())

}


输出:


&{{dogid} wouf 0}

&{dogid}

更简单:


func save(animal AnimalGetter) {

    fmt.Printf("%v\n", animal.GetAnimal())

}


查看完整回答
反对 回复 2021-08-16
?
慕无忌1623718

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

你可以用这个小反射技巧来做到这一点,尽管使用@VonC 建议的接口可能是一种更实用和惯用的方法。


无论如何,这是通过反射实现的:


func main() {


    d := Dog {

        Animal { "id1111" },

        "Barky",

        4,

    }

    fmt.Println(reflect.ValueOf(d).FieldByName("Animal").Interface().(Animal))

}


查看完整回答
反对 回复 2021-08-16
?
桃花长相依

TA贡献1860条经验 获得超8个赞

这里的 go/Go 方法是声明Animal为接口:


type Animal interface {

    ID() int

    Name() string

    // Other Animal field getters here.

}

然后,save可以将其Animal作为参数并使用Animal的方法获取所需的所有信息。


另一种可能的方法是使用reflect包Animal从结构中获取字段,但这会比使用接口更复杂、更脏并且可能更慢。


查看完整回答
反对 回复 2021-08-16
  • 3 回答
  • 0 关注
  • 186 浏览
慕课专栏
更多

添加回答

举报

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