【发布时间】: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