反映零不等于零

时间:2018-07-27 03:56:29

标签: go reflection

我需要检测某个结构字段的值是否为空。
this问题中,我找到了解决方案,但是当我在游乐场操作员==和func reflect.DeepEqual上尝试时,总是返回false
我在做什么错了,我该如何解决?

简单的例子:

func main() {
    s := ""
    v := reflect.ValueOf(s)
    t := reflect.TypeOf(s)

    zero := reflect.Zero(t)

    fmt.Println(zero == reflect.Zero(t)) // false
    fmt.Println(v == zero) // false 
    fmt.Println(v == reflect.Zero(t)) // false
}

我的情况:

type S struct {
    Empty string
    NotEmpty string
}

func main() {
    s := S{
        Empty: "",
        NotEmpty: "Some text",
    }


    v := reflect.ValueOf(s)
    for i := 0; i < v.NumField(); i++ {
        field := v.Field(i)

        fmt.Println(field, field == reflect.Zero(field.Type()))
    }
}

输出:

 false
Some text false

1 个答案:

答案 0 :(得分:3)

您想做的

package main

import (
    "fmt"
    "reflect"
)

func main() {
    s := ""
    v := reflect.ValueOf(s)
    t := reflect.TypeOf(s)
    fmt.Println(v.Interface() == reflect.Zero(t).Interface()) // true

}

就像上一个问题的答案一样。

为什么?

  

要比较两个值,请比较接口方法的结果。   在两个值上使用==不会比较它们的基础值   代表。

https://golang.org/pkg/reflect/#Value