在 Go 中如何检查结构体是否为空

本文翻译自:How to Check for an Empty Struct in Go。

本文概述了几种在 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 语言中识别空结构体的可靠方法,适用于不同的字段类型和结构体特性。如果你有更多的建议,请在下面的评论区提出。

感谢阅读,编码愉快!

延伸阅读

  • 原文地址: https://freshman.tech/snippets/go/check-empty-struct/

  • Comparison operators: https://go.dev/ref/spec#Comparison_operators

想要了解Go更多内容,欢迎扫描下方👇关注公众号,回复关键词 [实战群]  ,就有机会进群和我们进行交流


67aa9feb7855ba0e46cc5ec6fed1f08d.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值