有沒(méi)有一種通用的方法可以在 Go 中測(cè)試變量的初始值?鑒于這些測(cè)試:package mainimport "fmt"type FooStruct struct { A string B int}type BarStruct struct { A string B int C map[int]string}func main() { // string isinital test var s string fmt.Println(s == "") // int isinital test var i int fmt.Println(i == 0) // primitive struct isinital test var fp FooStruct fmt.Println(fp == FooStruct{}) // complex struct isinital test // fail -> invalid operation: fc == BarStruct literal (struct containing map[int]string cannot be compared) var fc BarStruct fmt.Println(fc == BarStruct{}) // map isinital test var m map[string]int fmt.Println(len(m) == 0) // map isinital test // fail -> invalid operation: m == map[string]int literal (map can only be compared to nil) fmt.Println(m == map[string]int{})}A: 什么是測(cè)試BarStruct初始的正確方法?B:有沒(méi)有一種通用的方法來(lái)測(cè)試任何 var 的初始值?
1 回答

慕沐林林
TA貢獻(xiàn)2016條經(jīng)驗(yàn) 獲得超9個(gè)贊
您可以使用reflect.DeepEqual:
bs := BarStruct{}
fmt.Println(reflect.DeepEqual(bs, BarStruct{}))
// Output:
// true
游樂(lè)場(chǎng):http : //play.golang.org/p/v11bkKUhXQ。
編輯:您還可以isZero像這樣定義一個(gè)輔助函數(shù):
func isZero(v interface{}) bool {
zv := reflect.Zero(reflect.TypeOf(v)).Interface()
return reflect.DeepEqual(v, zv)
}
這應(yīng)該適用于任何類型:
fmt.Println(isZero(0))
fmt.Println(isZero(""))
fmt.Println(isZero(bs))
fmt.Println(isZero(map[int]int(nil)))
- 1 回答
- 0 關(guān)注
- 191 瀏覽
添加回答
舉報(bào)
0/150
提交
取消