在 Golang中结构体是值类型。判断一个结构体是否为空,需要首先理解“空”的定义。本文将解释 Golang 中结构体的“空”是什么,并列出 3 种常见的判空方法。
文章目录
在 Go 中,结构体的“空”通常有以下几种含义:
int
类型的字段为 0
,string
类型的字段为 ""
。nil
:nil
来判断。明确结构体“空”的定义后,可以根据实际需求选择合适的判空方法。
这是最简单的判空方法,将结构体与其零值实例直接进行比较。
package main
import (
"fmt"
)
type MyStruct struct {
Name string
Age int
}
func main() {
var s MyStruct
fmt.Println(s == MyStruct{}) // true
s.Name = "Alice"
fmt.Println(s == MyStruct{}) // false
}
有时,你可能只关心结构体的字段是否全为零值,可以手动检查或通过反射实现。
package main
import (
"fmt"
)
type MyStruct struct {
Name string
Age int
}
func isStructEmpty(s MyStruct) bool {
return s.Name == "" && s.Age == 0
}
func main() {
var s MyStruct
fmt.Println(isStructEmpty(s)) // true
s.Age = 25
fmt.Println(isStructEmpty(s)) // false
}
package main
import (
"fmt"
"reflect"
)
func isEmptyStruct(s interface{}) bool {
v := reflect.ValueOf(s)
for i := 0; i < v.NumField(); i++ {
if !v.Field(i).IsZero() {
return false
}
}
return true
}
type MyStruct struct {
Name string
Age int
}
func main() {
var s MyStruct
fmt.Println(isEmptyStruct(s)) // true
s.Name = "Alice"
fmt.Println(isEmptyStruct(s)) // false
}
nil
来判空。package main
import (
"fmt"
)
type MyStruct struct {
Name string
Age int
}
func main() {
var s *MyStruct
fmt.Println(s == nil) // true
s = &MyStruct{}
fmt.Println(s == nil) // false
}
nil
和结构体字段是否为零值是两个不同的概念。nil
。在 Golang 中,结构体的“空”可以有多种定义。针对不同场景,可以选择以下方法:
nil
表示未初始化的场景。明确结构体“空”的定义,并选择合适的方法,可以使代码更高效且可维护。
你知道多少 YouTube 的快捷键?树莓派3B 翻墙实现指南免费VPN连接美国指南购买无限配置V2Ray服务指南Clash 端口转发完整指南VMess高级30天服务全面指南解决ExpressVPN常见问题:排除故障和寻找解决方案VPN 网络加速器:提高上网体验的有效工具Clash配置大全:从新手到高手一站式解决推荐一个新出的开源安卓多协议通用代理软件——SagerNetLinode Shadowsocks 优化指南破解版Hotspot VPN: 破解方法、风险提示及使用建议Shadowsocks DDoS攻击及防护指南便宜IEPL专线机场推荐:FATCAT 肥猫云怎么样?解锁Netfilx/Hulu/Hbo/Disney+/TikTok/ ChatGPTshadowsocks.nz优惠码:购买流程、优惠码使用教程及常见问题解答机场测速和简介 [SS/SSR/V2Ray/Trojan] 【联通】更新中站点地图404问题并提交至百度和谷歌后台Quantumult X (圈叉) 最新懒人图文教程白月光机场2024国庆节限时优惠码高速稳定高性价比 Trojan 机场推荐:WgetCloud 机场怎么样?赠送7天奈飞体验卡