go - 如何将结构转换为基本类型,而不是 Go 中的直接类型?

标签 go struct reflection casting

我需要将未知立即类型的接口(interface)转换为已知的基本类型。

例子

package main

import (
    "fmt"
    "reflect"
)

type A struct {
    foo string
}

type B A

func main() {
    bS := B{foo: "foo"}
    bI := reflect.ValueOf(bS).Interface()
    fmt.Println(bI)

    aS := bI.(A)
    fmt.Println(aS)
}

当这段代码运行时,可以理解的是,它会出现 panic 并显示以下消息

panic: interface conversion: interface {} is main.B, not main.A

在这个例子中:

  • 类型B对于接收接口(interface)bI的代码是未知的
  • B型是 保证是已知类型 A 的别名。

编辑:我不能在这里使用类型别名,因为这意味着类型 B 将成为编写类型 A 的另一种方式,因此我将丢失我定义的所有自定义方法B型。

最佳答案

您可以使用类型别名(在 Go1.9 中发布)来解决这个问题。

package main

import (
    "fmt"
    "reflect"
)

type A struct {
    foo string
}

type B = A

func main() {
    bS := B{foo: "foo"}
    bI := reflect.ValueOf(bS).Interface()
    fmt.Println(bI)

    aS := bI.(A)
    fmt.Println(aS)
}

注意type B = A 是为了让转换起作用。

关于go - 如何将结构转换为基本类型,而不是 Go 中的直接类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52462441/

相关文章:

c# - 获取不为空的属性名称

go - 无法为生产环境创建文件

loops - 如何将多个值从模板传递到模板?

struct - golang 2个 slice 类型,1个字段

c++ - 超出范围的局部变量......我认为

struct - const 值在匿名结构字段中的作用是什么?

java - 反射api中object.getClass()方法的使用

java - 如何从 Java 程序动态创建新的 .java 文件?

postgresql - PostgreSQL和Golang之间的数据类型

go - 按行值对 [][]string(二维 slice )进行分组