
在Go語言中,介面是一種非常強大且靈活的型別。然而,當我們嘗試讀取一個介面值中的結構位址時,可能會遇到一些困惑。那麼,如何讀取具有結構位址的介面值呢?在本文中,我們將為您解答這個問題,並提供一些實用的技巧和範例程式碼。無論您是初學者還是有經驗的Go開發者,本文都將對您有所幫助。讓我們一起來看看吧!
問題內容
我有資料型別為 interface{}
的變量,並將結構體的位址傳遞給它。現在我無法從介面讀取字段
程式碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | type UserData struct {
UserID string `json: "user_id" `
UserName string `json: "user_name" `
}
type Result struct {
Status string `json: "status" `
Data interface {} `json: "data" `
}
var res Result
res.Data = &UserData
json.Unmarshal([]byte(`{ "status" : "success" , "data" : { "user_id" :15, "user_name" : "abc" }}`), &res)
fmt.Println(res.Data)
fmt.Println(res.Data.UserName)
|
登入後複製
如果我使用 res.data.username
出現錯誤
#如何從介面讀取結構體欄位?
解決方法
將其與 golang 為什麼 go 結構中不存在的欄位在將所述結構編組到 json 後仍然存在。起初我以為它們是一樣的。但事實證明並非如此。
對於這個問題,res.data
擁有 *userdata
類型的值。所以一個簡單的型別斷言就可以了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | package main
import (
"encoding/json"
"fmt"
)
type userdata struct {
userid string `json: "user_id" `
username string `json: "user_name" `
}
type result struct {
status string `json: "status" `
data interface {} `json: "data" `
}
func main() {
var res result
res.data = &userdata{}
json.unmarshal([]byte(`{ "status" : "success" , "data" : { "user_id" :15, "user_name" : "abc" }}`), &res)
fmt.println(res.data)
fmt.println(res.data.(*userdata).username)
}
|
登入後複製
以下演示是 @mkopriva 的兩個演示的合併,它顯示了差異:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | package main
import (
"encoding/json"
"fmt"
"log"
)
type dbbatch struct {
fieldtokeep string `json: "field_to_keep" `
fieldtokeep2 string `json: "field_to_keep2" `
}
func main() {
jsonbatch := `{ "field_to_keep" : "xxxxx" , "field_to_keep2" : "26400527" , "field_to_delete" : "whynotdeleted" }`
var i interface {} = dbbatch{}
fmt.printf( "%t\n" , i)
if err := json.unmarshal([]byte(jsonbatch), &i); err != nil {
log.println(err)
}
fmt.printf( "%t\n" , i)
i = &dbbatch{}
fmt.printf( "%t\n" , i)
if err := json.unmarshal([]byte(jsonbatch), &i); err != nil {
log.println(err)
}
fmt.printf( "%t\n" , i)
}
|
登入後複製
輸出為:
1 2 3 4 | main.DBBatch
map[string] interface {}
*main.DBBatch
*main.DBBatch
|
登入後複製
以上是如何讀取具有結構位址的介面值的詳細內容。更多資訊請關注PHP中文網其他相關文章!