golang/gin常見用法和問題

結構體數組與接口數組轉換

如果想把[]struct轉爲[]interface,我們發現直接賦值會報錯。

理論上interface可以轉換任何數據,爲什麼結構體數組不可以呢?這是因爲interface的設計導致的,如果能理解interface的底層實現,就能很清楚知道如何轉換了。

如圖所示,與C++的虛函數類似,interface保存了兩部分內容,一部分是數據類型,另一部分是數據,所以可以被轉化爲任何數據。[]struct是被當作一個整體看待的,[]struct與struct,或者與int都沒區別,表示一種數據類型。[]struct可以轉換爲interface,但是[]interface表示有一組interface,一個[]struct,當然不可能轉化爲多個interface,也就不能轉化爲[]interface。

實際上我們的意思是把[]struct中的每個元素作爲獨立個體,再對應[]iterface中的每個interface。既然理解到這一層,就可以很好的實現轉換了:

// 根據[]struct x的元素個數,創建對應的[]interface y
y := make([]interface{}, len(x))

// 遍歷[]struct x中的每個元素,轉換爲[]interface y中的每個元素
for i, v := range x {
    y[i] = v
}

https://go.dev/doc/faq#convert_slice_of_interface
https://research.swtch.com/interfaces
https://stackoverflow.com/questions/44319906/why-golang-struct-array-cannot-be-assigned-to-an-interface-array

post發送的數據接收不到

如圖所示,postman發送的方式有很多種,如果gin註冊了post路由,那麼數據不可以使用params發送,這個不是post的數據。

應該在body中增加post數據,並且如果代碼中定義接收數據的結構體是json類型,如下:

type TEST struct {
	VALUE string `json:"value" binding:"required"`
}

那麼postman發送時,body界面,選擇raw(源數據),後面還要選擇JSON,默認是TEXT。如果是TEXT,由於content-type不匹配,會收不到數據。

如果boday類型選擇form-data或者x-www-form-urlencoded,那麼接收的結構體也要設定爲對應的類型,增加form類型指定。

type CreateRequest struct {
    Username string `json:"username" form:"username"`
    Phone    string `json:"phone" form:"phone"`
    Password string `json:"password" form:"password"`
}

https://stackoverflow.com/questions/53705933/gin-framework-can-not-get-the-data-from-postman

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章