[英]Best patterns for dynamic checks in Go without reflection?
我们的任何代码库中是否存在有助于减少对类型化字段/结构的冗余检查的良好模式? 我觉得 Lisp 可以很好地处理这些事情,但试图了解是否有任何好的模式而不需要像反射等东西。
例如,对于自定义结构,我发现自己需要做很多事情:
type helloworld struct {
field1 *string
field2 *string
field3 int
}
if field1 != nil {
if len([]rune(*field1)) > MAX_ALLOWED_LEN) return errors.New("exceeded max allowable length")
}
if field2 != nil {
if len([]rune(*field2)) > MAX_ALLOWED_LEN) return errors.New("exceeded max allowable length")
}
if field3 != 0 { //do stuff}
....
地图很棒,但很多时候打字可能过于笼统,这也会引起混乱。 我问,因为其中一些检查是多余的,并且通过很多包扩散,所以当我需要添加额外的字段时,重构是耗时的。 如果我在保持高性能的同时对某些类型或字段进行验证,那就太好了。
3个方向,不是最直接的,但它们可以减少你的检查块:
方法一:定义自己的注解
Golang 在结构中有注解
type bla struct {
t string `json:"some,omitempty"`
}
这实际上是一个开放的注释结构(标签)。
一个很好的例子(包含一些反射)是https://github.com/mitchellh/mapstructure
查看 mapstructure.go 文件的第 374 行。 它非常可重用,您可以将其用作您自己的注释的基础。
要在您的上下文中使用它,您将创建然后可以解析的类型。
方法二:干检 function
您的支票似乎相同或相似。
遍历字段的通用比较器:
func check(fields ...interface{}) error {
for v:=range fields {
if v==nil {
return errors.New("nil")
}
switch v.type() {
case *string:
if len([]rune(*v)) > MAX_ALLOWED_LEN) {
return errors.New("exceeded max allowable length")
}
}
...
}
}
方法3:Generics。
方法 2 中的 switch 类型可能能够以通用样式重写。 不是更容易,但可以更漂亮。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.