如何在golang中获取struct字段类型?

时间:2018-04-07 03:41:10

标签: go

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类型?

1 个答案:

答案 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值。