Golang go-playground/validator:如何在oneof规则中包含单引号
问题:使用go-playground/validator/v10的oneof标签验证含单引号的字段值失败
我在使用Golang的go-playground/validator/v10包验证结构体字段时,尝试通过oneof标签验证字段值是否匹配包含单引号的预定义值,但带单引号的预期有效值始终验证失败。
原代码
package main import ( "fmt" "github.com/go-playground/validator/v10" ) // Struct with validation tag type Award struct { Title string `validate:"oneof=palm'dor level'dor 'state award'"` } func main() { validate := validator.New() // Test cases testCases := []Award{ {"palm'dor"}, // Expected: Valid {"level'dor"}, // Expected: Valid {"state award"}, // Expected: Valid {"other"}, // Expected: Invalid } for _, testCase := range testCases { err := validate.Struct(testCase) if err != nil { fmt.Printf("Input: %q - Invalid (%v)\n", testCase.Title, err) } else { fmt.Printf("Input: %q - Valid\n", testCase.Title) } } }
预期行为
程序应将"palm'dor"、"level'dor"和"state award"判定为有效输入,其他值标记为无效。
实际输出
Input: "palm'dor" - Invalid (Key: 'Award.Title' Error:Field validation for 'Title' failed on the 'oneof' tag) Input: "level'dor" - Invalid (Key: 'Award.Title' Error:Field validation for 'Title' failed on the 'oneof' tag) Input: "state award" - Valid Input: "other" - Invalid (Key: 'Award.Title' Error:Field validation for 'Title' failed on the 'oneof' tag)
解决方案
问题原因
validator的oneof标签默认用空格分隔选项,单引号的作用是包裹包含空格的选项(比如'state award')。但如果选项本身包含单引号,直接书写会被解析器错误识别,导致选项匹配失败。
解决方法
当选项中包含单引号时,需要用两个单引号进行转义;如果选项不含空格,不需要额外用单引号包裹。修改后的oneof标签格式如下:
Title string `validate:"oneof=palm''dor level''dor 'state award'"`
修改后的完整代码
package main import ( "fmt" "github.com/go-playground/validator/v10" ) type Award struct { Title string `validate:"oneof=palm''dor level''dor 'state award'"` } func main() { validate := validator.New() testCases := []Award{ {"palm'dor"}, // Expected: Valid {"level'dor"}, // Expected: Valid {"state award"}, // Expected: Valid {"other"}, // Expected: Invalid } for _, testCase := range testCases { err := validate.Struct(testCase) if err != nil { fmt.Printf("Input: %q - Invalid (%v)\n", testCase.Title, err) } else { fmt.Printf("Input: %q - Valid\n", testCase.Title) } } }
正确输出
Input: "palm'dor" - Valid Input: "level'dor" - Valid Input: "state award" - Valid Input: "other" - Invalid (Key: 'Award.Title' Error:Field validation for 'Title' failed on the 'oneof' tag)
内容的提问来源于stack exchange,提问作者Aslam-Ep
相关产品推荐
相关产品推荐

