首先,请查看以下代码段:
package main
import (
"fmt"
)
func main() {
var para1 struct {
email, addr string
}
para1.email = "test@test.com"
if para1 != nil {
fmt.Println(para1)
}
}
Run Code Online (Sandbox Code Playgroud)
当我编译这段代码时,我遇到了编译器错误:
./struct_func.go:15: cannot convert nil to type struct { email string; addr string }
Run Code Online (Sandbox Code Playgroud)
如何判断我的struct变量是否为零?或者我必须验证属性
if para1.email != nil {
fmt.Println(para1)
}
Run Code Online (Sandbox Code Playgroud)
您可以将其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)
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
{test@test.com }
test@test.com
test@test.com
Run Code Online (Sandbox Code Playgroud)
当分配内存来存储值时,无论是通过声明还是调用make或new,并且没有提供显式初始化,内存都会被赋予默认初始化.这种值的每个元素都设置为其类型的零值:布尔值为false,整数为0,浮点数为0.0,字符串为"",指针,函数,接口,切片,通道和映射为nil.这种初始化是递归完成的,因此,例如,如果没有指定值,则结构数组的每个元素都将其字段归零.
我知道这已经安静了一段时间了,但是验证结构是否为空的一个很好的可重用方法是使用内置的“reflect”。它允许您与结构的空副本进行比较。isEmpty这是使用基于 Reflect 的函数的代码版本。
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)
}
}
Run Code Online (Sandbox Code Playgroud)
http://play.golang.org/p/geqHKMSWzp
| 归档时间: |
|
| 查看次数: |
10236 次 |
| 最近记录: |