2 回答

TA貢獻1818條經驗 獲得超8個贊
我已經嘗試過類型斷言,但是,我不相信在我的情況下這會起作用,因為數據來自默認情況下已經是字符串的 URL。如何檢測條目是否為字符串、整數、布爾值等?
一般來說,讓事情變得過于動態并不是一個好主意(使事情的推理變得比需要的更復雜)。最好定義一個結構,然后將值讀入其中。
也就是說,如果我們堅持你問題的措辭,你可以做一些事情:
例如,創建一個可以存儲一個值的多個版本的通用類型,以及一個標志來指示它是否正確解析為該類型:
type GenericValue struct {
String string
Integer int
IntegerOK bool
Float float64
FloatOK bool
Boolean bool
BooleanOK bool
}
func ParseGenericValue(v string) GenericValue {
var result GenericValue
var err error
result.String = v
result.Integer, err = strconv.Atoi(v)
result.IntegerOK = err == nil
result.Float, err = strconv.ParseFloat(v, 64)
result.FloatOK = err == nil
result.Boolean, err = strconv.ParseBool(v)
result.BooleanOK = err == nil
return result
}
所有這一切都是使用strconv包嘗試將輸入字符串解析為整數/浮點數/布爾值,如果解析成功,它會生成相應的字段OK。例如,如果IntegerOK為 true 則表示將此字符串解析為整數成功。
該GenericValue結構仍保留原始輸入字符串,因此您可以使用它來檢查此值是否為整數并對其執行某些操作,或者檢查它是否為字符串并執行其他操作
var v = ParseGenericValue("2")
if v.IntegerOK {
// do something with v.Integer
} else {
// maybe just handle v.String in a different way
}

TA貢獻1783條經驗 獲得超4個贊
查看此包,它將 URL 參數轉換為具有預期字段的結構。當然,當您知道預期的數據類型時,這很有用。
例如
type ServiceInput struct {
? Latitude? ? ? ? ? ? ? ? ?float64? `schema:"latitude,required"` //add validations too
? Longitude? ? ? ? ? ? ? ? ?float64? `schema:"longitude"`
}
...
r := new(ServiceInput)
urlParams := request.URL.Query() //request is http.Request
decoder := schema.NewDecoder()
if err := decoder.Decode(r, urlParams); err != nil {
? ? return nil, lib.ErrBadRequest{Err: err}
}
現在假設請求為 GET /foo/bar?latitude=1.2&longitude=3.4,它將相應地設置結構字段。
如果您對字段的類型一無所知,那么您必須嘗試解析為不同的類型并進行檢查。
- 2 回答
- 0 關注
- 145 瀏覽
添加回答
舉報