可能遇到的问题
- 类型断言失败:当将
interface{}
转换回原基本类型时,如果实际存储在 interface{}
中的类型与期望转换的类型不一致,会导致类型断言失败,引发运行时错误。
举例说明
package main
import (
"fmt"
)
func main() {
var num int = 10
var i interface{} = num
// 尝试将interface{}转换回string类型,会导致运行时错误
str, ok := i.(string)
if!ok {
fmt.Println("类型断言失败")
} else {
fmt.Println(str)
}
}
如何避免
- 使用类型断言的comma-ok形式:通过
value, ok := i.(type)
这种形式进行类型断言,ok
变量会指示类型断言是否成功,避免运行时错误。
package main
import (
"fmt"
)
func main() {
var num int = 10
var i interface{} = num
// 使用comma-ok形式进行类型断言
result, ok := i.(int)
if ok {
fmt.Println(result)
} else {
fmt.Println("类型断言失败")
}
}
- 使用
switch
语句进行类型断言:可以通过 switch
语句对 interface{}
中的值进行类型断言,在不同的 case
分支中处理不同类型的情况。
package main
import (
"fmt"
)
func main() {
var i interface{} = "hello"
switch value := i.(type) {
case int:
fmt.Printf("类型是int,值为 %d\n", value)
case string:
fmt.Printf("类型是string,值为 %s\n", value)
default:
fmt.Println("未知类型")
}
}