我真的是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语句来进行比较?
答案 0 :(得分:3)
reflect.Type
是interface
,具有称为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
x
和string
类型都是字符串。两者的类型比较均返回true:
fmt.Println(reflect.TypeOf(x("")).Kind() == reflect.String) // prints true
fmt.Println(reflect.TypeOf("").Kind() == reflect.String) // prints true
x
和string
类型是不同的:
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")
}
}