如何使用reflect.TypeOf([] string {“ a”})。Elem()?

时间:2018-07-08 04:40:08

标签: go

我真的是golang的新手,我在基础方面苦苦挣扎。我写了一段这样的代码:

   A  B  C  D
0  2  1  0  1
1  1  1  2  1
2  1  0  0  0
3  0  2  2  0

运行此代码时,出现错误

  

无效操作:reflect.TypeOf([]字符串文字).Elem()==   reflect.String(类型不匹配的reflect.Type和reflect.Kind)

我不了解文档https://golang.org/pkg/reflect/,因为我找不到有关如何引用不同的“类型”或“种类”的示例

我应该如何编写if语句来进行比较?

3 个答案:

答案 0 :(得分:3)

reflect.Typeinterface,具有称为Kind()的方法。根据文档:

    // Kind returns the specific kind of this type.
    Kind() Kind

所以你应该写:

if reflect.TypeOf([]string{"a"}).Elem().Kind() == reflect.String {
  log.Println("success")
}

答案 1 :(得分:2)

要比较类型,请使用:

if reflect.TypeOf([]string{"a"}).Elem() == reflect.TypeOf("") {
  log.Println("success")
}

要比较种类,请使用:

if reflect.TypeOf([]string{"a"}).Elem().Kind() == reflect.String {
  log.Println("success")
}

如果要测试特定类型,请比较类型。如果要确定它是哪种类型,请比较种类。

此示例可能会有所帮助:

type x string

xstring类型都是字符串。两者的类型比较均返回true:

fmt.Println(reflect.TypeOf(x("")).Kind() == reflect.String) // prints true
fmt.Println(reflect.TypeOf("").Kind() == reflect.String) // prints true

xstring类型是不同的:

fmt.Println(reflect.TypeOf(x("")) == reflect.TypeOf(""))    // prints false

答案 2 :(得分:2)

对于简单的类型比较(如显示的内容),不需要反射。您可以改用type assertion

stuff := []interface{}{"hello", 1, nil}
for _, obj := range stuff {
        if _, ok := obj.(string); ok {
                fmt.Printf("is a string\n")
        } else if _, ok := obj.(int); ok {
                fmt.Printf("is an int\n")
        } else {
                fmt.Printf("is something else\n")
        }
}