面试题答案
一键面试安全性风险
- 类型不匹配恐慌:如果接口实际存储的类型与断言的类型不一致,会触发运行时恐慌(
panic
)。例如,将一个存储了int
类型值的接口断言为string
类型。
避免风险的方法
- 使用带检测的类型断言:使用
value, ok := interfaceValue.(targetType)
形式,ok
为bool
类型,若断言成功,ok
为true
,value
为断言出的值;若断言失败,ok
为false
,value
为targetType
类型的零值,不会触发恐慌。 - 使用
switch
进行类型断言:通过switch
语句可以对接口值进行多种类型的断言,且不会触发恐慌。
示例
package main
import (
"fmt"
)
func main() {
var i interface{} = 10
// 带检测的类型断言
value, ok := i.(string)
if!ok {
fmt.Println("断言失败,不是string类型")
} else {
fmt.Println("断言成功:", value)
}
// 使用switch进行类型断言
switch v := i.(type) {
case int:
fmt.Printf("类型是int,值为:%d\n", v)
case string:
fmt.Printf("类型是string,值为:%s\n", v)
default:
fmt.Println("未知类型")
}
}
在上述示例中,首先通过带检测的类型断言尝试将接口值i
断言为string
类型,由于实际类型是int
,断言失败。然后通过switch
语句对接口值i
进行类型断言,成功识别出实际类型为int
并输出对应的值。