【问题标题】:How do I type-assert that a value is a pointer (to a string)?如何类型断言一个值是一个指针(指向一个字符串)?
【发布时间】:2014-05-07 15:24:18
【问题描述】:

我正在尝试创建一个返回泛型类型长度的方法。如果我们有一个字符串,我们调用 len(string),或者如果它是一个 interface{} 类型的数组,我们也调用 len()。这很好用,但是,它在你传递一个指向字符串的指针时不起作用(我假设我对数组和切片也有同样的问题)。那么如何检查我是否有一个指针,并取消引用它呢?

func (s *Set) Len(i interface{}) int {
    if str, ok := i.(string); ok {
        return len(str)
    }
    if array, ok := i.([]interface{}); ok {
        return len(array)
    }
    if m, ok := i.(map[interface{}]interface{}); ok {
        return len(m)
    }
    return 0
}

【问题讨论】:

  • 我想说,在 func (s *Set) Len(...) int 方法中,最后一条语句应该是 panic("Can't get length of the value"),因为 this
  • 另请注意,您的代码与反射无关——类型断言和类型切换是 Go 程序的“原生”,而对反射的访问是通过恰当命名为 reflection 的标准包提供的。
  • @kostix 最初,我试图找到一种方法来通用地检查输入是否是指针,然后取消引用它。但我意识到这对于我需要的东西来说过于复杂了
  • 不明白为什么它被否决了。人们可能会在代码生成设置中非常合理地提出这个问题。

标签: go


【解决方案1】:

您可以对其他类型执行相同的操作:

if str, ok := i.(*string); ok {
    return len(*str)
}

此时您可能想要使用type switch 而不是更冗长的 if:

switch x := i.(type) {
case string:
    return len(x)
case *string:
    return len(*x)
…
}

【讨论】:

  • 很好,谢谢。我认为开关肯定会更优雅
猜你喜欢
  • 2013-09-08
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多