首先,请查看以下代码段:
package main
import (
"fmt"
)
func main() {
var para1 struct {
email, addr string
}
para1.email = "test@test.com"
if para1 != nil {
fmt.Println(para1)
}
}
当我编译这段代码时,我遇到了编译错误:
./struct_func.go:15: cannot convert nil to type struct { email string; addr string }
如何判断我的struct变量是否为零?或者我必须验证属性,如
if para1.email != nil {
fmt.Println(para1)
}
答案 0 :(得分:5)
您可以将struct
与其零值进行比较。您可以测试string
的零(空)值""
或测试string
长度为零。例如,
package main
import (
"fmt"
)
func main() {
var para1 struct {
email, addr string
}
para1Zero := para1
para1.email = "test@test.com"
if para1 != para1Zero {
fmt.Println(para1)
}
if para1.email != "" {
fmt.Println(para1.email)
}
if len(para1.email) != 0 {
fmt.Println(para1.email)
}
}
输出:
{test@test.com }
test@test.com
test@test.com
The Go Programming Language Specification
当分配内存来存储值时,通过a 声明或调用make或new,并且没有明确的初始化 如果提供,则为存储器提供默认初始化。每 将此类值的元素设置为其类型的零值:false 对于布尔值,0表示整数,0.0表示浮点数,“”表示字符串,nil 用于指针,函数,接口,切片,通道和映射。这个 初始化是递归完成的,所以例如每个元素 如果没有指定值,结构数组将使其字段归零。
答案 1 :(得分:3)
我知道这已经安静了一段时间,但验证结构为空的一种可靠的可重用方法是使用"反射"内置。它允许您与结构的空副本进行比较。以下是使用基于反射的isEmpty
函数的代码版本。
package main
import (
"fmt"
"reflect"
)
func isEmpty(object interface{}) bool {
//First check normal definitions of empty
if object == nil {
return true
} else if object == "" {
return true
} else if object == false {
return true
}
//Then see if it's a struct
if reflect.ValueOf(object).Kind() == reflect.Struct {
// and create an empty copy of the struct object to compare against
empty := reflect.New(reflect.TypeOf(object)).Elem().Interface()
if reflect.DeepEqual(object, empty) {
return true
}
}
return false
}
func main() {
var para1 struct {
email, addr string
}
para1.email = "test@test.com"
if isEmpty(para1) {
fmt.Println("It's empty")
} else {
fmt.Println(para1)
}
}
答案 2 :(得分:1)
var para1 struct {
email, addr string
}
在此行之后,para1
是一个包含2个空字符串as you can see here的结构值。
只有切片,地图,通道,指针和函数可以是nil
。因此,将para1
与nil
进行比较没有意义,编译器也在抱怨。
不可否认,错误信息可能更好。
如果你想知道para1
是否为空,你应该给它的类型命名并在其上声明一个方法:
type Parameter struct {
email, addr string
}
func (p Parameter) Empty() bool {
return (p.email != "" && p.addr != "")
}