为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕姐8265434 2023-08-07 14:30:25
我的应用程序中有多个使用 golang 的结构。结构中的某些字段具有maxsize标记,有些则没有。例如:type structone struct {  fieldone string `valid:MaxSize(2)`  fieldtwo string }type structtwo struct {  fieldone string `valid:MaxSize(2)`  fieldtwo string }因此,如果在运行时不包含任何有效的最大大小标签,我想为所有字段设置默认的最大大小。是否可以?有人可以帮忙吗。
查看完整描述

4 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

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

不。


查看完整回答
反对 回复 2023-08-07
?
慕无忌1623718

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

}


查看完整回答
反对 回复 2023-08-07
?
郎朗坤

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

    }

}


查看完整回答
反对 回复 2023-08-07
?
侃侃尔雅

TA贡献1801条经验 获得超15个赞

其他答案似乎假设您在 Go 中使用普通字符串并询问您是否可以限制它们的最大大小。通过提出的一些建议可以实现这一目标。


但是,从您提供的代码片段中,我推断您是在询问validate go 包是否可以使用标签指定结构中所有字段的默认最大大小。


不幸的是,该库当前不支持为所有字段指定默认验证标记。您必须为结构的所有字段显式定义验证标记。


然而,您想要实现的目标是可能的,但库需要扩展。


一项建议是将其扩展以支持语法,例如:


type MyStruct struct {

    valid.Default `valid:MaxSize(5)`


    field1 string

    field2 string

}


查看完整回答
反对 回复 2023-08-07
  • 4 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信