type Role int
type User struct {
Id int64
Name string
Role Role
}
func ListFields(a interface{}) {
v := reflect.ValueOf(a).Elem()
for j := 0; j < v.NumField(); j++ {
f := v.Field(j)
n := v.Type().Field(j).Name
t := f.Type().String()
fmt.Printf("Name: %s Kind: %s Type: %s\n", n, f.Kind(), t)
}
}
func main() {
var u User
ListFields(&u)
}
去运行main.go
名称:Id种类:int64类型:int64
名称:名称种类:字符串类型:字符串
名称:角色种类:int类型:main.Role&lt; ---如何获取int类型?
答案 0 :(得分:0)
在Go Kind()
中返回基本类型(这是您要求的),Type()
返回直接类型(您定义为自定义类型)。对于您定义的任何自定义类型,您永远不会从Type()
获取基本类型。我稍微修改了您的示例,以帮助您了解Kind()
始终返回实际的基本类型(或类型,请参阅https://golang.org/pkg/reflect/#Kind),尽管有许多嵌套的自定义类型。
package main
import (
"fmt"
"reflect"
)
type Role int
type Role2 Role
type Role3 Role2
type User struct {
Id int64
Name string
Role Role3
}
func ListFields(a interface{}) {
v := reflect.ValueOf(a).Elem()
for j := 0; j < v.NumField(); j++ {
f := v.Field(j)
n := v.Type().Field(j).Name
t := f.Type().String()
fmt.Printf("Name: %s Basic Type or Kind: %s Direct or Custom Type: %s\n", n, f.Kind(), t)
}
}
func main() {
var u User
ListFields(&u)
}
https://goplay.space/#-eTlN4dGzj_k
换句话说,Kind和Type都是类型。它们匹配基本类型(int64,字符串等),并且对于自定义类型不同。没有理由用Kind替换Type值。