获取结构属性名



我想使用反射包返回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。

您需要在Type上操作而不是Value

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

使用类型:

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

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

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

相关内容

  • 没有找到相关文章

最新更新