关于类型断言的小细节
第一:类型断言是什么?
答:类型断言是go语言中专门用来判断空接口承接数据的类型的一种方式
第二:类型断言的语法?
- 第一是用一个变量去承接类型断言,如果类型判断符合,就会返回空接口承接的本来的值,如果不正确就会引发panic。
package mainimport "fmt"func main() {var try interface{} = 1v := try.(int)fmt.Printf("变量try的类型确实是int类型,值为%d\n", v)}
//输出为变量try的类型确实是int类型,值为1
package mainimport "fmt"func main() {var try interface{} = 1v := try.(string)fmt.Printf("变量try的类型确实是int类型,值为%d\n", v)}panic: interface conversion: interface {} is int, not stringgoroutine 1 [running]:
main.main()/Users/wangziheng01/go/src/main/main.go:8 +0x34
exit status 2
- 第二就是用两个变量却承接类型断言,如果判断错误(即接口值的类型与断言的类型不匹配),那么
第一个返回值将是断言类型的零值,第二个返回值将是 false。
package mainimport "fmt"func main() {var try interface{} = 1v, ok := try.(string)if ok {fmt.Printf("变量ok的值为%v\n", ok)fmt.Printf("变量try的值是%v\n", v)} else {fmt.Printf("变量ok的值为%v\n", ok)fmt.Printf("变量try的值是%v\n", v)}}
/*
变量ok的值为false
变量try的值是
/*
假如判断正确,那么第一个返回值就是原来的值,第二个返回值就是true。
package mainimport "fmt"func main() {var try interface{} = 1v, ok := try.(int)if ok {fmt.Printf("变量ok的值为%v\n", ok)fmt.Printf("变量try的值是%v\n", v)} else {fmt.Printf("变量ok的值为%v\n", ok)fmt.Printf("变量try的值是%v\n", v)}}
/*
变量ok的值为true
变量try的值是1
/*
第三:类型断言常用于判断空接口类型的方式?
package mainfunc main() {var try interface{} = 1switch try.(type) {case int:println("int")case string:println("string")case bool:println("bool")default:println("other")}}
结果就会输出 int。
另外,value.(type)
是 Go 语言中的一个特殊语法,用于在 switch
语句中获取接口值的具体类型。这种语法只能在 switch
语句中使用,不能在其他地方使用。