1. 程式人生 > 其它 >【Golang】interface{}資料型別轉換為string、int、float…

【Golang】interface{}資料型別轉換為string、int、float…

技術標籤:Go學習之路go語言interface資料型別

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)

-----這裡就是型別斷言的方式,來將interface{}確定其對應的資料型別,從而能夠進行相同資料型別的賦值,例如以下可以:

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.") } } }