我正在嘗試為杜松子酒創建自己的驗證器,但我希望它是“通用的”,所以比方說,我想要一個接口 IsValidtype IsValid interface { IsValid() bool},并使一些結構在實現該接口的某些字段中具有綁定:“IsValid”。但我不知道如何編寫我的自定義驗證器來獲取該字段,將其轉換為 IsValid 接口,然后執行 isValid 方法。我正在使用 go-playground 驗證程序包:https ://github.com/go-playground/validatorif v, ok := binding.Validator.Engine().(*validator.Validate); ok { // registering validation for isValid v.RegisterValidation("isValid", func(fl validator.FieldLevel) bool { isValidField := // TODO do something to cast it to that interface return isValidField.IsValid() })}
1 回答

翻過高山走不出你
TA貢獻1875條經驗 獲得超3個贊
該FieldLevel類型具有此方法:
// returns current field for validation
Field() reflect.Value
reflect.Value有這個方法:
func (v Value) Interface() (i any)
接口將 v 的當前值作為接口{}返回。它相當于:
var i interface{} = (v's underlying value)
如果 Value 是通過訪問未導出的結構字段獲得的,它會發生恐慌。
您可以使用類型斷言將interface{}/any值用作更具體的接口,如下所示:
var i interface{} = something
var x = i.(MyInterface)
如果該值i未實現,這將引起恐慌MyInterface。要檢查這種情況,可以使用替代形式:
var x, ok = i.(MyInterface)
if ok {
// use x
} else {
// type conversion failed
}
將它們放在一起,您的代碼將是這樣的:
isValidField, ok := fl.Field().Interface().(IsValid)
- 1 回答
- 0 關注
- 128 瀏覽
添加回答
舉報
0/150
提交
取消