Dismiss
Join GitHub today
GitHub is home to over 20 million developers working together to host and review code, manage projects, and build software together.
golang 如何验证struct字段的数据格式 #125
Comments
zhangyachen added the golang label
8 days ago
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
zhangyachen commented 8 days ago • edited
假设我们有如下结构体:
我们需要对结构体内的字段进行验证合法性:
我们可能会这么写:
这样的话代码比较冗余,而且如果结构体新加字段,还需要再修改验证函数再加一段if判断。这样代码比较冗余。我们可以借助golang的structTag来解决上述的问题:
validate:"number,min=1,max=1000"就是structTag。如果对这个比较陌生的话,看看下面这个:写过golang的基本都用过
json:xxx这个用法,json:xxx其实也是一个structTag,只不过这是golang帮你实现好特定用法的structTag。而validate:"number,min=1,max=1000"是我们自定义的structTag。实现思路
我们定义一个接口
Validator,定义一个方法Validate。再定义有具体意义的验证器例如StringValidator、NumberValidator、EmailValidator来实现接口Validator。这里为什么要使用接口?假设我们不使用接口代码会怎么写?
这样的话判断逻辑不能写在一个函数中,因为返回值validator会因为structTag的不同而不同,而且validator也不能当做函数参数做传递。而我们定义一个接口,所有的validator都去实现这个接口,上述的问题就能解决,而且逻辑更加清晰和紧凑。 关于接口的使用可以看下标准库的io Writer,Writer是个interface,只有一个方法Writer:
而输出函数可以直接调用参数的Write方法即可,无需关心到底是写到文件还是写到标准输出:
言归正传,我们看下完整代码,代码是Custom struct field tags in Golang中给出的:
代码很好理解,结构也很清晰,不做过多解释了^_^
github上其实已经有现成的验证包了govalidator,支持内置支持的验证tag和自定义验证tag:
参考资料: