4 回答
TA贡献1744条经验 获得超4个赞
预声明的类型string不允许您限制string它可以保存的值的长度。
您可以做的是使用未导出的字段,以便无法在包外部访问(设置)它,并提供一个 setter 方法来检查长度,如果不满足您的要求(或限制长度),则拒绝设置它值到允许的最大值)。
例如:
func (s *structone) SetFieldone(v string) error {
if len(v) > 2 {
return errors.New("too long")
}
s.fieldone = v
return nil
}
TA贡献1921条经验 获得超9个赞
该程序读取自身,将标签添加valid:MaxSize(2)到属性structone.fieldone,然后将更新的程序打印到os.Stdout。
package main
import (
"go/ast"
"go/printer"
"go/token"
"log"
"os"
"strings"
"golang.org/x/tools/go/ast/astutil"
"golang.org/x/tools/go/loader"
)
type structone struct {
fieldone string
fieldtwo string
}
func main() {
var conf loader.Config
_, err := conf.FromArgs([]string{"."}, false)
if err != nil {
log.Fatal(err)
}
prog, err := conf.Load()
if err != nil {
log.Fatal(err)
}
astutil.Apply(prog.InitialPackages()[0].Files[0], addTag("structone.fieldone", "`valid:MaxSize(2)`"), nil)
printer.Fprint(os.Stdout, prog.Fset, prog.InitialPackages()[0].Files[0])
}
func addTag(p string, tag string) func(*astutil.Cursor) bool {
pp := strings.Split(p, ".")
sName := pp[0]
pName := pp[1]
return func(cursor *astutil.Cursor) bool {
n := cursor.Node()
if x, ok := n.(*ast.TypeSpec); ok {
return x.Name.Name == sName
} else if x, ok := n.(*ast.Field); ok {
for _, v := range x.Names {
if v.Name == pName {
x.Tag = &ast.BasicLit{
Value: tag,
Kind: token.STRING,
}
}
}
} else if _, ok := n.(*ast.File); ok {
return true
} else if _, ok := n.(*ast.GenDecl); ok {
return true
} else if _, ok := n.(*ast.TypeSpec); ok {
return true
} else if _, ok := n.(*ast.StructType); ok {
return true
} else if _, ok := n.(*ast.FieldList); ok {
return true
}
return false
}
}
TA贡献1801条经验 获得超15个赞
其他答案似乎假设您在 Go 中使用普通字符串并询问您是否可以限制它们的最大大小。通过提出的一些建议可以实现这一目标。
但是,从您提供的代码片段中,我推断您是在询问validate go 包是否可以使用标签指定结构中所有字段的默认最大大小。
不幸的是,该库当前不支持为所有字段指定默认验证标记。您必须为结构的所有字段显式定义验证标记。
然而,您想要实现的目标是可能的,但库需要扩展。
一项建议是将其扩展以支持语法,例如:
type MyStruct struct {
valid.Default `valid:MaxSize(5)`
field1 string
field2 string
}
- 4 回答
- 0 关注
- 132 浏览
添加回答
举报