Golang-获取struct属性名称

时间:2014-08-04 21:35:56

标签: reflection struct go

我想使用reflect包返回struct属性的名称。到目前为止,我有:

type MultiQuestions struct {
    QuestionId      int64  
    QuestionType    string 
    QuestionText    string 
}
func (q *MultiQuestions) StructAttrName() string {
    return reflect.ValueOf(q).Elem().Field(0).Name
}

然而,这给了我一个错误reflect.ValueOf(q).Elem().Field(0).Name undefined (type reflect.Value has no field or method Name)

我尝试过强制转换为StructField,但这也没有用。我如何获得Struct的名称?

在这种情况下,我感兴趣的名字是QuestionId,QuestionType和QuestionText。

3 个答案:

答案 0 :(得分:3)

您需要对Type而不是Value

进行操作
func (q *MultiQuestions) StructAttrName() string {
    return reflect.Indirect(reflect.ValueOf(q)).Type().Field(0).Name
}

playground

答案 1 :(得分:0)

使用类型:

package main

import (
    "fmt"
    "reflect"
)

type MultiQuestions struct {
    QuestionId   int64
    QuestionType string
    QuestionText string
}

func (q *MultiQuestions) StructAttrName() string {
    return reflect.TypeOf(q).Elem().Field(0).Name
}

func main() {
    fmt.Println((&MultiQuestions{}).StructAttrName())
}

http://play.golang.org/p/su7VIKXBE2

答案 2 :(得分:0)

您还可以考虑github.com/fatih/structure中定义的效用函数,例如Fields(s interface{}) []string,它适用于指针或对象,包括struct中的struct个字段。< / p>

package main

import (
    "fmt"
    "reflect"

    "github.com/fatih/structure"
)

type MultiQuestions struct {
    QuestionId   int64
    QuestionType string
    QuestionText string
    SubMQ        SubMultiQuestions
}

type SubMultiQuestions struct{}

func (q *MultiQuestions) StructAttrName() string {
    return reflect.Indirect(reflect.ValueOf(q)).Type().Field(0).Name
}

func main() {
    fmt.Println((&MultiQuestions{}).StructAttrName())
    fmt.Println(Fields(&MultiQuestions{}))
    fmt.Println(Fields(MultiQuestions{}))
}

输出:

SubMQ
[QuestionId QuestionType QuestionText SubMQ]
[QuestionId QuestionType QuestionText SubMQ]

请参阅此 play.golang.org

中的完整示例