interface轉其他類型
有時候返回值是interface類型的,直接賦值是無法轉化的
package main import ( "fmt" ) func main() { var a interface{} var b string a = "123" //b = a //cannot use a (type interface {}) as type string in assignment: need type assertion b = a.(string) fmt.Println(b) }
輸出:
123
通過a.(string) 轉化為string,通過a.(int)轉化為類型。
package main import ( "fmt" ) func main() { var a interface{} var b string var c int a = "123" //b = a //cannot use a (type interface {}) as type string in assignment: need type assertion b = a.(string) fmt.Println(b) a = 124 c = a.(int) fmt.Println(c) }
可以通過a.(type)來判斷a可以轉為什么類型。
注意事項
- map記得分配內存
- 解析出來的int類型會變成float64類型
- 注意判斷不為nil后再轉換類型
package main import ( "encoding/json" "fmt" ) func main() { //1.准備一段json b := []byte(`{"Name":"sary","Age":18}`) //2.聲明空接口 var i interface{} //3.解析 err := json.Unmarshal(b, &i) if err != nil { fmt.Println("json err:", err) } //自動轉map fmt.Println(i) //4.使用interface的json,可以判斷類型 m := i.(map[string]interface{}) for k, v := range m { switch value := v.(type) { case nil: fmt.Println(k, "is nil", "null") case string: fmt.Println(k, "is string", value) case int: fmt.Println(k, "is int", value) case float64: fmt.Println(k, "is float64", value) case []interface{}: fmt.Println(k, "is an array:") for i, u := range value { fmt.Println(i, u) } case map[string]interface{}: fmt.Println(k, "is an map:") default: fmt.Println(k, "is unknown type", fmt.Sprintf("%T", v)) } } }
輸出:
map[Age:18 Name:sary]
Name is string sary
Age is float64 18
package main import ( "encoding/json" "fmt" ) func main() { var m map[string]interface{} //聲明變量,不分配內存 m = make(map[string]interface{}) //必可不少,分配內存 m["name"] = "sary" var age int = 18 m["age"] = age m["addr"] = "China" print_map(m) fmt.Println() data, err := json.Marshal(m) if err != nil { fmt.Println("err:", err) } else { fmt.Println("data:", data) } m1 := make(map[string]interface{}) err = json.Unmarshal(data, &m1) if err != nil { fmt.Println("err:", err) } else { print_map(m1) } fmt.Println() value, ok := m1["key1"] if ok { fmt.Printf(value.(string)) } else { fmt.Println("key1 不存在") } } //解析 map[string]interface{} 數據格式 func print_map(m map[string]interface{}) { fmt.Println("enter print_map########### ") for k, v := range m { switch value := v.(type) { case nil: fmt.Println(k, "is nil", "null") case string: fmt.Println(k, "is string", value) case int: fmt.Println(k, "is int", value) case float64: fmt.Println(k, "is float64", value) case []interface{}: fmt.Println(k, "is an array:") for i, u := range value { fmt.Println(i, u) } case map[string]interface{}: fmt.Println(k, "is an map:") print_map(value) default: fmt.Println(k, "is unknown type", fmt.Sprintf("%T", v)) } } fmt.Println("out print_map ########### ") }
輸出:
enter print_map###########
name is string sary
age is int 18
addr is string China
out print_map ###########
data: [123 34 97 100 100 114 34 58 34 67 104 105 110 97 34 44 34 97 103 101 34 58 49 56 44 34 110 97 109 101 34 58 34 115 97 114 121 34 125]
enter print_map###########
addr is string China
age is float64 18
name is string sary
out print_map ###########
key1 不存在