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}
没有问题。
来源:oschina
链接:https://my.oschina.net/u/4271034/blog/4590712