go 類型轉換方式(interface 類型的轉換)
go 在做類型轉換時,報錯:
cannot convert m (type interface {}) to type Msg: need type assertion
原因:
go 的在 interface 類型轉換的時候, 不是使用類型的轉換, 而是使用
t,ok := i.(T)
例子:
//處理網絡消息 func ProcessMsg(m interface{}){ //var a interface{} = m //Msg(m) msg := m.(*Msg)
補充:go []interface{}的類型轉換
看代碼吧~
package main import ( "fmt" "strings" ) func getName(params ...interface{}) string { var stringSlice []string for _, param := range params { stringSlice = append(stringSlice, param.(string)) } return strings.Join(stringSlice, "_") } func main() { fmt.Println(getName("redis", "slave", "master")) }
上面的代碼如果類型不匹配,會產生panic錯誤,如果想不產生panic錯誤
str, ok := param.(string)
如果ok為false,則str為空,不報錯。
也可以這樣:
package main import ( "fmt" "reflect" "strings" ) func getName(params ...interface{}) string { var stringSlice []string for _, param := range params { stringSlice = append(stringSlice, param.(string)) } return strings.Join(stringSlice, "_") } func main() { var aa []interface{} = make([]interface{}, 3) aa[0] = "redis" aa[1] = "slave" aa[2] = "master" fmt.Println(reflect.TypeOf(aa)) fmt.Println(reflect.TypeOf(aa[0])) fmt.Println(getName(aa...)) }
輸出:
[]interface {}
string
redis_slave_master
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- Golang語言學習拿捏Go反射示例教程
- go語言求任意類型切片的長度操作
- Golang的func參數及返回值操作
- Go利用反射reflect實現獲取接口變量信息
- golang編程開發使用sort排序示例詳解