Golang interface{} 转换为某个结构体

ps:开发中实际遇到的场景,在 go 语言中 interface{} 可以接收任何类型,但是我们实际使用不光需要接收,我们接收之后更是要操作这些值

简单的类型转换

var num1 int32 = 10
fmt.Printf("Type: %T, Value: %d\n", num1, num1)
num2 := uint32(num1)
fmt.Printf("Type: %T, Value: %d\n", num2, num2)

output

Type: int32, Value: 10
Type: uint32, Value: 10

简单的类型转换直接使用 Type(x) 转换即可。

interface{} 类型转换
直接利用反射的原理,使用断言来实现。

x.(T)

使用断言会存在两种可能。

  • 第一种,如果断言的类型 T 是一个具体类型,然后类型断言检查 x 的动态类型是否和 T 相同。如果这个检查成功了,类型断言的结果是 x 的动态值,它的类型是 T
    换句话说,具体类型的类型断言从它的操作对象中获得具体的值。如果检查失败,接下来这个操作会抛出 panic
  • 第二种,如果相反地断言的类型 T 是一个接口类型,然后类型断言检查是否 x 的动态类型满足 T。如果这个检查成功了,动态值没有获取到;这个结果仍然是一个有相同动态类型和值部分的接口值,但是结果为类型 T
    换句话说,对一个接口类型的类型断言改变了类型的表述方式,改变了可以获取的方法集合(通常更大),但是它保留了接口值内部的动态类型和值的部分。

以上两段出自 go 语言圣经 https://books.studygolang.com/gopl-zh/ch7/ch7-10.html

测试一下

type Order struct {
     
	ordId      int    `json:"order_id" validate:"required"`
	customerName string `json:"customerName" validate:"required"`
	callback   func() `json:"call_back" validate:"required"`
}

func InterfaceToStruct(object interface{
     }) {
     
	obj := object.(Order)
	fmt.Printf("Object = %v\n", obj)
}
func main() {
     
	o := Order{
     
		ordId:      100,
		customerName: "Jack",
		callback: func() {
     },
	}
	InterfaceToStruct(o)
}

output

Object = {100 Jack 0x49f940}

没有问题。

你可能感兴趣的:(golang,学习路线,golang,go,interface,反射,断言)