我的包需要能够让我的用户明确地定义字段后端数据库列名,如果他们愿意的话。
默认情况下,我将使用字段名称 - 但有时他们需要手动指定列名称,就像JSON包一样 - unmarshal在需要时使用显式名称。
如何在代码中使用此显式值?我甚至不知道它叫什么,所以Google现在真的让我失望了。
以下是JSON的解组函数需要的例子:
type User struct {
Name string
LastName string `json:"last_name"`
CategoryId int `json:"category_id"`
}
我需要使用这样的东西?
// Paprika is my package name.
type User struct {
Name string
LastName string `paprika:"last_name"`
CategoryId int `paprika:"category_id"`
}
我的包将构建SQL查询,我不能仅仅依赖字段的名称 - 我需要能够让他们手动设置列名。因此,目前仅使用已定义的列。
// Extracts resource information using reflection and
// saves field names and types.
func loadTypeToSchema(resource interface{}) {
resourceType := reflect.TypeOf(resource)
// Grab the resource struct Name.
fullName := resourceType.String()
name := fullName[strings.Index(fullName, ".")+1:]
// Grabs the resource struct fields and types.
fieldCount := resourceType.NumField()
fields := make(map[string]string)
for i := 0; i <= fieldCount-1; i++ {
field := resourceType.Field(i)
fields[field.Name] = field.Type.Name()
}
// Add resource information to schema map.
schema[name] = fields
}
答案 0 :(得分:7)
首先,您所谓的装饰器实际上称为tags。您可以使用反射阅读这些标签。 reflect
包甚至还有own example。
尽管如此,这是打印结构(Click to play)成员的所有标签的另一个例子:
type Foo struct {
A int `tag for A`
B int `tag for B`
C int
}
func main() {
f := Foo{}
t := reflect.TypeOf(f)
for i := 0; i < t.NumField(); i++ {
fmt.Println(t.Field(i).Tag)
}
}
请注意,如果f
是指针,例如a *Foo
,您必须首先间接(取消引用)该值,否则TypeOf
返回的类型不是结构而是指针NumField
以及Field()
不行。