You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 05:22:40