【发布时间】:2018-03-10 15:19:50
【问题描述】:
情况
编写代码生成器,检查结构的字段并使用结构标签添加验证函数
问题
这里需要检查type字段是否为自定义类型
即,
以下不是自定义类型
int, []int,*int,[]Integer,map[string]PhoneNumber
但以下是自定义类型
Integer,PhoneNumber,*PhoneNumber
我想我可以使用以下函数来查找完全匹配并可能添加地图,[] 支持
func isBuiltInType(typ string) bool {
switch typ {
case "bool", "byte", "complex128", "complex64", "error":
case "float32", "float64":
case "int", "int16", "int32", "int64", "int8":
case "rune", "string":
case "uint", "uint16", "uint32", "uint64", "uint8", "uintptr":
default:
return false
}
return true
}
但是有没有更好的方法来使用parse.ParseExpr 等
【问题讨论】:
-
您是要检查类型声明还是源中的任意值?
ParseExpr不能单独为您提供实际类型,因为表达式没有任何类型信息。如果您展示了一个需要确定类型的示例,这可能会有所帮助。此外,您所称的“自定义类型”可能具有您在此处列出的任何类型作为其基础类型。 -
@JimB struct 字段包含三个部分
field name,field type和struct tag。我需要检查field type。让custom type具有底层类型作为内置是可以的在类型。由于我正在编写代码来生成 Validate 函数以用于嵌套检查的结构,因此如果它实现validaterf,我需要在字段上调用 Validate -
更好的方法可能是,在解析源代码后,收集所有实现您要调用的方法的类型,在这种情况下,它似乎类似于
Validate() error。然后,当您为某些结构生成验证代码并检查其字段的类型时,检查给定类型是否包含在实现您打算生成调用的方法的收集类型集中。 -
完全正确,这就是为什么我需要检查它是否存在但内置类型、arra 等。
标签: parsing go types generated-code