猿问

将结构体接口转换为相同的结构体

假设我有两个结构:


type Pet {

  Name string

}


type PetTwo {

  Name string

}

现在假设我将 Pet 转换为接口。假设我用来执行此操作的包不了解 Pet 类型,如何从界面中键入 Assert PetTwo?


var ctx context.Context

pet := Pet{ Name : "Foo" }

ctx = context.WithValue(ctx, "pet", pet)

petTwo := ctx.Value("pet").(PetTwo) // panics

fmt.Println(petTwo.Name) // prints "Foo"

有没有一种方法可以在没有类型断言的情况下访问 pet 的内容?


我尝试过将结构相互嵌入、类型断言、未命名类型的类型断言等等。


主要目标是能够Pet在不知道类型的情况下访问包的内容Pet。


实现该目标的一个丑陋的 hack 是从 json 进行编组和解组:


    jsonData, _ := json.Marshal(ctx.Value("pet"))

    var petTwo PetTwo

    json.Unmarshal(jsonData, &petTwo)

    fmt.Println(petTwo.Name) // prints "Foo"


慕村9548890
浏览 101回答 1
1回答

喵喔喔

使用reflect包访问未知类型的Name字段:ctx := context.WithValue(context.Background(), "pet", Pet{"Fido"})v := reflect.ValueOf(ctx.Value("pet"))name := v.FieldByName("Name").String()fmt.Println(name) // prints Fido在操场上运行它。
随时随地看视频慕课网APP

相关分类

Go
我要回答