【问题标题】:check if unknown interface{} is empty检查未知接口{}是否为空
【发布时间】:2021-10-05 10:52:45
【问题描述】:

您好,我想知道如果 interface{} 为空,我将如何在 Go 中进行验证。 我试过reflect.TypeOf(v) == nil,但它总是返回false。

    var h  Bar
    var t  Foo
    pointers := make([]interface{}, 0)
    pointers = append(pointers, &h)
    pointers = append(pointers, &t)

func test(byteValue []byte, data []interface{}) {
    for _, v := range  data {
        fmt.Println(reflect.TypeOf(v) == nil)
        if err := lib.Unmarshal(byteValue, v); err == nil {
            fmt.Println(err)
        }
    }
}

【问题讨论】:

  • “空”是什么意思?你可以直接和nil比较一个接口,或者你想确定它是否包含一个空的类型,比如切片或映射?
  • 基本上我传递了一个结构指针,我需要检查它是否为空而没有任何修改的字段。
  • @AegisDev 这不是空的。没有字段是空的。 Go 中的所有类型都有一个zero value。
  • 是,带零。
  • 您可以控制Foo 和Bar 类型吗?这些是您的interface{} 切片将包含的唯一具体类型吗?如果是这样,您不需要反思;您可以简单地使用类型开关。见play.golang.org/p/KR467c3E9uY

标签: go reflection


【解决方案1】:
func isZero(v interface{}) bool {
    // reflect.ValueOf will panic on a nil value.
    if v == nil {
        return true
    }
    return reflect.ValueOf(v).IsZero()
}

Example

【讨论】:

  • 我尝试过这样的事情,但我没有成功,因为我传递了一个 var 的指针
猜你喜欢
  • 2012-11-15
  • 2014-08-20
  • 2017-05-25
  • 1970-01-01
  • 2016-10-12
  • 1970-01-01
  • 2010-12-23
  • 2013-07-18
  • 2013-07-12
相关资源
最近更新 更多