我想使用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。
答案 0 :(得分:3)
您需要对Type
而不是Value
func (q *MultiQuestions) StructAttrName() string {
return reflect.Indirect(reflect.ValueOf(q)).Type().Field(0).Name
}
答案 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())
}
答案 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
中的完整示例