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

我的包中有以下结构。


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)

  // ...

}


Qyouu
浏览 187回答 3
3回答

慕的地8271018

也许您可以添加一个接口以确保获得对父结构的引用: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())}

慕无忌1623718

你可以用这个小反射技巧来做到这一点,尽管使用@VonC 建议的接口可能是一种更实用和惯用的方法。无论如何,这是通过反射实现的:func main() {    d := Dog {        Animal { "id1111" },        "Barky",        4,    }    fmt.Println(reflect.ValueOf(d).FieldByName("Animal").Interface().(Animal))}

桃花长相依

这里的 go/Go 方法是声明Animal为接口:type Animal interface {    ID() int    Name() string    // Other Animal field getters here.}然后,save可以将其Animal作为参数并使用Animal的方法获取所需的所有信息。另一种可能的方法是使用reflect包Animal从结构中获取字段,但这会比使用接口更复杂、更脏并且可能更慢。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go