gpt4 book ai didi

go - 将结构接口(interface)转换为相同的结构

转载 作者:数据小太阳 更新时间:2023-10-29 03:45:45 26 4
gpt4 key购买 nike

假设我有两个结构:

type Pet {
Name string
}

type PetTwo {
Name string
}

现在假设我将 Pet 转换为接口(interface)。假设用于执行此操作的包不知道 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"

最佳答案

使用 reflect用于访问未知类型的名称字段的包:

ctx := context.WithValue(context.Background(), "pet", Pet{"Fido"})
v := reflect.ValueOf(ctx.Value("pet"))
name := v.FieldByName("Name").String()
fmt.Println(name) // prints Fido

Run it on the playground .

关于go - 将结构接口(interface)转换为相同的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57423674/

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