亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何獲取父嵌入的結構字段值?

如何獲取父嵌入的結構字段值?

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 關注
  • 223 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號