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條經驗 獲得超16個贊
其他答案似乎假設您在 Go 中使用普通字符串并詢問您是否可以限制它們的最大大小。通過提出的一些建議可以實現這一目標。
但是,從您提供的代碼片段中,我推斷您是在詢問validate go 包是否可以使用標簽指定結構中所有字段的默認最大大小。
不幸的是,該庫當前不支持為所有字段指定默認驗證標記。您必須為結構的所有字段顯式定義驗證標記。
然而,您想要實現的目標是可能的,但庫需要擴展。
一項建議是將其擴展以支持語法,例如:
type MyStruct struct {
valid.Default `valid:MaxSize(5)`
field1 string
field2 string
}
- 4 回答
- 0 關注
- 180 瀏覽
添加回答
舉報