我可以为结构中的字符串字段设置默认最大长度吗?

我的应用程序中有多个使用 golang 的结构。结构中的某些字段具有maxsize标记,有些则没有。例如:


type structone struct {

  fieldone string `valid:MaxSize(2)`

  fieldtwo string 

}


type structtwo struct {

  fieldone string `valid:MaxSize(2)`

  fieldtwo string 

}

因此,如果在运行时不包含任何有效的最大大小标签,我想为所有字段设置默认的最大大小。是否可以?有人可以帮忙吗。


慕姐8265434
浏览 133回答 4
4回答

繁花如伊

我可以为结构中的字符串字段设置默认最大长度吗?不。

慕无忌1623718

预声明的类型string不允许您限制string它可以保存的值的长度。您可以做的是使用未导出的字段,以便无法在包外部访问(设置)它,并提供一个 setter 方法来检查长度,如果不满足您的要求(或限制长度),则拒绝设置它值到允许的最大值)。例如:func (s *structone) SetFieldone(v string) error {    if len(v) > 2 {        return errors.New("too long")    }    s.fieldone = v    return nil}

郎朗坤

该程序读取自身,将标签添加valid:MaxSize(2)到属性structone.fieldone,然后将更新的程序打印到os.Stdout。package mainimport (    "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    }}

侃侃尔雅

其他答案似乎假设您在 Go 中使用普通字符串并询问您是否可以限制它们的最大大小。通过提出的一些建议可以实现这一目标。但是,从您提供的代码片段中,我推断您是在询问validate go 包是否可以使用标签指定结构中所有字段的默认最大大小。不幸的是,该库当前不支持为所有字段指定默认验证标记。您必须为结构的所有字段显式定义验证标记。然而,您想要实现的目标是可能的,但库需要扩展。一项建议是将其扩展以支持语法,例如:type MyStruct struct {    valid.Default `valid:MaxSize(5)`    field1 string    field2 string}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go