本文概述了幾種在 Go 中判斷結構體是否為空的方法,適用於具有可比較欄位和不可比較欄位的結構體。Go 中的空結構體是指所有欄位均設定為對應欄位零值的結構體。
使用零值字面量進行檢查
對於僅包含可比較欄位的結構體,只需要將結構體例項與其零值字面量進行比較:
package main import ( "fmt" ) type Person struct { name string age int email int } func main() { var p1 Person p2 := Person{ name: "John", age: 45, } fmt.Println(p1 == Person{}) fmt.Println(p2 == Person{}) }
true false
確保在 if
語句中使用括號括住結構體字面量,以避免出現解析問題:
if p1 == (Person{}) { }
對於指向結構的指標,請確保在比較之前取消引用:
p3 := &Person{} if *p3 == (Person{}) { }
使用 reflect.DeepEqual()
對於具有**不可比較欄位(slices, maps, functions)**的結構,可以使用 reflect.DeepEqual()
進行比較:
package main import ( "fmt" "reflect" ) type Person struct { name string age int email int favouriteColors []string // non-comparable field } func main() { var p1 Person p2 := Person{ name: "John", age: 45, favouriteColors: []string{"red", "green"}, } fmt.Println(reflect.DeepEqual(p1, Person{})) fmt.Println(reflect.DeepEqual(p2, Person{})) }
true false
這個 DeepEqual()
方法實際上適用於任何結構比較,而不僅僅是檢查結構體是否為空。
使用 reflect.Value.IsZero()
該方法在 Go 1.13
中引入,reflect.Value.IsZero()
提供了另一種檢查空結構體的方法:
package main import ( "fmt" "reflect" ) type Person struct { name string age int email int favouriteColors []string // non-comparable field } func main() { var p1 Person p2 := Person{ name: "John", age: 45, favouriteColors: []string{"red", "green"}, } fmt.Println(reflect.ValueOf(p1).IsZero()) fmt.Println(reflect.ValueOf(p2).IsZero()) }
true false
總結
這些技巧提供了在 Go 語言中識別空結構體的可靠方法,適用於不同的欄位型別和結構體特性。如果你有更多的建議,請在下面的評論區提出。
感謝閱讀,編碼愉快!
延伸閱讀
Comparison operators: go.dev/ref/spec#Co…