在Go中确认结构字段非零

时间:2017-02-03 14:09:31

标签: pointers go reflection interface

我正在尝试编写一个带struct的泛型函数,并确认给定的字段具有非零值。

这是我的功能:

func CheckRequiredFields(kind string, i interface{}, fields ...string) error {
    for _, field := range fields {
        value := reflect.ValueOf(i).FieldByName(field)
        if value.Interface() == reflect.Zero(value.Type()).Interface() {
            return fmt.Errorf("missing required %s field %s", kind, field)
        }
    }
    return nil
}

如果将struct作为i传入,则效果很好,但如果i是指向struct的指针则会失败。

如果传入的值是指针,我如何反映接口的值?

1 个答案:

答案 0 :(得分:1)

您可以使用reflect.Indirect,它返回v指向的值。如果v是nil指针,则Indirect返回零值。如果v不是指针,则间接返回v。

如果要检查值是否为指针,请检查它是Kind,并使用Elem()取消引用指针。

v := reflect.ValueOf(i)
if v.Kind() == reflect.Ptr {
    v = v.Elem()
}