4 回答

TA貢獻(xiàn)1744條經(jīng)驗(yàn) 獲得超4個(gè)贊
預(yù)聲明的類型string不允許您限制string它可以保存的值的長(zhǎng)度。
您可以做的是使用未導(dǎo)出的字段,以便無(wú)法在包外部訪問(wèn)(設(shè)置)它,并提供一個(gè) setter 方法來(lái)檢查長(zhǎng)度,如果不滿足您的要求(或限制長(zhǎng)度),則拒絕設(shè)置它值到允許的最大值)。
例如:
func (s *structone) SetFieldone(v string) error {
if len(v) > 2 {
return errors.New("too long")
}
s.fieldone = v
return nil
}

TA貢獻(xiàn)1921條經(jīng)驗(yàn) 獲得超9個(gè)贊
該程序讀取自身,將標(biāo)簽添加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貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超16個(gè)贊
其他答案似乎假設(shè)您在 Go 中使用普通字符串并詢問(wèn)您是否可以限制它們的最大大小。通過(guò)提出的一些建議可以實(shí)現(xiàn)這一目標(biāo)。
但是,從您提供的代碼片段中,我推斷您是在詢問(wèn)validate go 包是否可以使用標(biāo)簽指定結(jié)構(gòu)中所有字段的默認(rèn)最大大小。
不幸的是,該庫(kù)當(dāng)前不支持為所有字段指定默認(rèn)驗(yàn)證標(biāo)記。您必須為結(jié)構(gòu)的所有字段顯式定義驗(yàn)證標(biāo)記。
然而,您想要實(shí)現(xiàn)的目標(biāo)是可能的,但庫(kù)需要擴(kuò)展。
一項(xiàng)建議是將其擴(kuò)展以支持語(yǔ)法,例如:
type MyStruct struct {
valid.Default `valid:MaxSize(5)`
field1 string
field2 string
}
- 4 回答
- 0 關(guān)注
- 190 瀏覽
添加回答
舉報(bào)