Go 验证结构变量是否为空

Go 验证结构变量是否为空,go,Go,首先,查看以下代码片段: 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:

首先,查看以下代码片段:

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 }
如何验证我的结构变量是否为零?或者我必须验证像这样的属性

if para1.email != nil {
    fmt.Println(para1)
}
在这一行之后,
para1
是一个包含2个空字符串的结构值

只有切片、贴图、通道、指针和函数可以
nil
。因此,将
para1
nil
进行比较是没有意义的,编译器对此表示不满

诚然,错误信息可能更好

如果您想知道
para1
是否为空,您应该为其类型指定一个名称并在其上声明一个方法:

type Parameter struct {
    email, addr string
}

func (p Parameter) Empty() bool {
    return (p.email != "" && p.addr != "")
}

您可以将
struct
与其零值进行比较。您可以测试
字符串的零(空)值
或测试
字符串的长度为零。比如说,

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

当分配内存来存储值时,通过 声明或调用make或new,并且没有显式初始化 如果提供,则为内存提供默认初始化。每个 该值的元素的类型设置为零值:false 对于布尔型,0表示整数,0.0表示浮点数,0.0表示字符串,0.0表示字符串 用于指针、函数、接口、切片、通道和映射。这 初始化是递归完成的,例如 如果未指定值,结构数组的字段将为零


我知道这已经安静了一段时间,但是验证结构是否为空的一种很好的可重用方法是使用“reflect”内置函数。它允许您与结构的空副本进行比较。下面是一个基于reflect的使用
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)
    }
}

字符串不能为零,只能为空。但是指向字符串的指针可以是零。因此,要么检查空字符串,要么将字段设置为指向字符串的指针(不推荐)
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)
    }
}