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}
沒有問題,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/56505.html
標籤:其他
下一篇:Go GoLand安裝及環境配置
