有更好的方法吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
var collection []string
anyFunc(&collection) // valid
anyFunc(collection) // invalid
anyFunc(nil) // invalid
anyFunc("test") // invalid

func anyFunc(collection interface{}) error {
    rv := reflect.ValueOf(collection)
    if rv.Kind() != reflect.Ptr || rv.IsNil() || reflect.Indirect(reflect.ValueOf(collection)).Kind() != reflect.Slice {
        return errors.New("Invalid collection type, need pointer to slice.")
    }
    return nil
}

在play.golang.org上的完整示例

  • play.golang.org/p/q4hlv8aQmGU吗?
  • 没有反思是不可能的,不是吗?
  • 如果知道什么类型的切片,则可以使用类型断言而不是反射,但是如果知道任何类型的切片,则可以,而不是没有反射。
  • 好的,我不知道具体的类型。 谢谢!

[此答案的文字最初是由mkopriva撰写的]

1
2
3
4
5
6
7
func loadData(collection interface{}) error {
    rv := reflect.ValueOf(collection)
    if rv.Kind() == reflect.Ptr && rv.Elem().Kind() == reflect.Slice {
        return nil  
    }
    return errors.New("Invalid collection type, need pointer to slice.")
}