亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

創建具有類型接口的映射以通過 URL 參數接受任意數據類型

創建具有類型接口的映射以通過 URL 參數接受任意數據類型

Go
開滿天機 2023-06-01 14:13:38
我想將 URL 參數從字符串轉換為正確的數據類型并將其存儲在地圖中。我認為類型應該是 []interface,用于存儲多種數據類型的列表。我正在創建一個鍵值存儲,但目前它只存儲字符串。我已經閱讀了關于將數據轉換為字節的 GOB,但不明白。我已經嘗試過類型斷言,但是,我不相信在我的情況下這會起作用,因為數據來自默認情況下已經是字符串的 URL。如何檢測條目是否為字符串、整數、布爾值等?地圖:var data map[string][]string 主函數中的 handleFunc 調用 handleCreate 函數r.HandleFunc("/insert/{key}/{value}", handleCreate).Methods("POST")  handleFunc 函數func handleCreate(w http.ResponseWriter, r *http.Request) {params := mux.Vars(r)k := params["key"]v := params["value"]data[k] = append(data[k], v)fmt.Fprintf(w, "KEY: %v: VALUE: %v was inserted into the key-value store successfully", k, v)}完整代碼的鏈接:https://github.com/RipRoss/TrainingProjects/blob/master/main.go預期的結果是將 URL 中給定的值存儲為它的預期用途。例如 /dog/Zeus 會將 Zeus 存儲為帶有鍵 'dog' 的字符串,而 /cash/1000 會將 1000 存儲為帶有鍵 'cash' 的 int 類型
查看完整描述

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

}


查看完整回答
反對 回復 2023-06-01
?
慕娘9325324

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,它將相應地設置結構字段。


如果您對字段的類型一無所知,那么您必須嘗試解析為不同的類型并進行檢查。


查看完整回答
反對 回復 2023-06-01
  • 2 回答
  • 0 關注
  • 145 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號