这篇文章主要介绍了go 类型转换方式(interface 类型的转换),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
go 类型转换方式(interface 类型的转换)
更新时间:2021年05月04日 10:11:11 作者:一抹黑黑黑
这篇文章主要介绍了go 类型转换方式(interface 类型的转换),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
go 在做类型转换时,报错:
cannot convert m (type interface {}) to type Msg: need type assertion
原因:
go 的在 interface 类型转换的时候, 不是使用类型的转换, 而是使用
例子:
1 2 3 4 5 | //处理网络消息 func ProcessMsg(m interface{}){ //var a interface{} = m //Msg(m) msg := m.(*Msg) |
补充:go []interface{}的类型转换
看代码吧~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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错误
1 | str, ok := param.(string) |
如果ok为false,则str为空,不报错。
也可以这样:
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 ( "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