我正在尝试检查Go语言中结构体的类型。这是我能想到的最好方法。是否有更好的方法来实现,最好不需要初始化一个结构体?
package main
import (
"fmt"
"reflect"
)
type Test struct{
foo int
}
func main() {
t := Test{5}
fmt.Println(reflect.TypeOf(t) == reflect.TypeOf(Test{}))
}
我正在尝试检查Go语言中结构体的类型。这是我能想到的最好方法。是否有更好的方法来实现,最好不需要初始化一个结构体?
package main
import (
"fmt"
"reflect"
)
type Test struct{
foo int
}
func main() {
t := Test{5}
fmt.Println(reflect.TypeOf(t) == reflect.TypeOf(Test{}))
}
类型断言:
package main
import "fmt"
type Test struct {
foo int
}
func isTest(t interface{}) bool {
switch t.(type) {
case Test:
return true
default:
return false
}
}
func main() {
t := Test{5}
fmt.Println(isTest(t))
}
更简化的版本:
_, isTest := v.(Test)
如果你想了解技术细节,可以参考语言规范。
_, ok := t.(Test)
这样的就不行呢?它会报错 invalid type assertion: t.(Test) (non-interface type Test on left)
。 - ollien你可以将一个“类型化”的nil
指针值传递给reflect.TypeOf()
,并调用Type.Elem()
来获取所指向值的类型。这不会分配或初始化类型的值(在问题上),因为只使用了nil
指针值:
fmt.Println(reflect.TypeOf(t) == reflect.TypeOf((*Test)(nil)).Elem())
您可以在Go Playground上尝试它。
附注:这是一个完全重复的内容,但找不到原始内容。
var i interface{} = t
v, ok := i.(Test)
//v = concrete value of Test struct
//ok = is (t) a type of the Test struct?