它是一个空值结构nil

时间:2014-09-26 17:54:12

标签: go

请查看以下代码段。

package main

import "fmt"

type Empty struct {
    Field1, Field2 string
}

func main() {

    value := Empty{}

    fmt.Println(value == nil)
    fmt.Printf("%p", &value)

}

我有编译错误

./empty_struct.go:19: cannot convert nil to type Empty

如果值结构类型为空,我如何检查它?

3 个答案:

答案 0 :(得分:5)

指针,切片,通道,接口和贴图是唯一可以与nil进行比较的类型。结构值不能与nil进行比较。

如果结构中的所有字段都具有可比性(就像在您的示例中那样),那么您可以与结构的已知零值进行比较:

 fmt.Println(value == Empty{})

如果结构包含不可比较的字段(切片,地图,通道),那么您需要编写代码来检查每个字段:

 func IsAllZero(v someStructType) bool {
     return v.intField == 0 && v.stringField == "" && v.sliceField == nil
 }
 ...
 fmt.Println(isAllZero(value))

答案 1 :(得分:2)

它是一种值类型,如int,因此它不能为零。只有指针和接口类型可以为零。如果要允许nil值,请将其设为指针:

value := &Empty{}

答案 2 :(得分:2)

你可以定义一个" nil"结构的值,例如:

var nilEmpty = Empty{}
fmt.Println(value == nilEmpty)

nil只能用于指针类型(切片,通道,接口和地图)。

请记住,如果结构中有切片或任何无法比较的值,结构相等性并不总是有效,那么你必须使用reflect.DeepEqual

来自http://golang.org/ref/spec#Comparison_operators

  
    

如果所有字段都具有可比性,则结构值具有可比性。如果相应的非空白字段相等,则两个struct值相等。