切換語言為:簡體

在 Go 中如何檢查結構體是否為空

  • 爱糖宝
  • 2024-06-27
  • 2058
  • 0
  • 0

本文概述了幾種在 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 語言中識別空結構體的可靠方法,適用於不同的欄位型別和結構體特性。如果你有更多的建議,請在下面的評論區提出。

感謝閱讀,編碼愉快!

延伸閱讀

0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.