如何键入断言值是指针(到字符串)?

时间:2014-05-07 15:24:19

标签: go

我正在尝试创建一个返回泛型类型长度的方法。如果我们有一个字符串,我们调用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
}

1 个答案:

答案 0 :(得分:7)

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

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

此时您可能想要使用type switch而不是更详细的ifs:

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