【Golang】interface{}資料型別轉換為string、int、float…
阿新 • • 發佈:2021-01-09
1.問題背景:
在首次做Go的相關專案的時候,遇到了將get請求得到的Json字串進行反序列化(json.Unmarshal([]byte(data), &m))
,轉換成var m map[string]interface{}
此種類型,因此m[“access_token”]
就成了interface{}的資料型別,我們需要將此值賦值給一個string型別的變數,但此時我直接使用string()方法則報錯。
這裡的type assertion其實就給出瞭解決方案,即型別斷言
2.解決方法:
通過查閱相關資料發現的解決方案是,通過value.(type)
var data interface{}
data = "hahhhh"
var data1 string
data1 = data.(string)
fmt.Println(data1)//輸出hahhhh
//但如果是data的型別不為string時,將會報錯,如下。
data2 := data.(int) //會產生錯誤,錯誤原因如下
3.總結:
情形一:
從上述的解釋來看,好像我專案裡直接寫.(string)好像也不是很嚴謹,應該進行型別的判斷,然後在進行賦值操作,只不是我那裡的m[“access_token”]必定是
string型別,所以不會出現錯誤。
推薦以下方法,先進行型別斷言:
if value, ok := m["access_token"].(string); ok {
fmt.Println("型別判斷成功", value) //輸出--->型別判斷成功 hahhhh
}
情形二:
或者存在未知資料型別的情況時,我們可以用type-switch方法(參考Go語言中文網),如下所示:
func MyPrintf(args ...interface{}) {
for _, arg := range args {
switch arg.(type) {
case int:
fmt.Println(arg, "is an int value.")
case string:
fmt.Println(arg, "is a string value.")
case int64:
fmt.Println(arg, "is an int64 value.")
default:
fmt.Println(arg, "is an unknown type.")
}
}
}