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

标签 go

假设我有两个结构:

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/

相关文章:

Golang 动态访问结构属性

pdf - 如何通过gopdf将文本数据打印成pdf?

go - 无法在 mac os 中安装 gRPC for go

mysql - Golang MySQL 使用 IN 运算符查询未定义数量的参数

linux - 避免解析 Xrandr 输出

go - Net/http简单动态路由

go - FieldA.Eq 未定义(类型 cqlc.BooleanColumn 没有字段或方法 Eq)

go - 无法使用vscode解析自己定义的golang软件包

go - 如何取两个大 float

http.Redirect() 带标题