类型断言(Type Assertion)
非安全的类型断言
package main
import "fmt"
func main() {
var a interface{} = "ss"
t := a.(string)
fmt.Printf("%v", t)
}
在上面,我们将一个类型为 interface{}
的变量转换成了 string 类型。
我们可以使用类型断言(type assertion),以将一个类型为 interface{}
的变量,转换为基本数据类型或者复杂数据类型。
所谓”非安全“的类型断言,是指如果这个转换失败,则会直接在运行时报错:
package main
import "fmt"
func main() {
var a interface{} ="ss"
t:= a.(int)
fmt.Printf("%d",t)
}
Error:
panic: interface conversion: interface {} is string, not int
goroutine 1 [running]:
main.main()
/Working/GoPlayGround/main.go:7 +0x45
因此,就有了安全的类型断言。
安全的类型断言
package main
import "fmt"
func main() {
var s interface{} = "BrainWu"
if v, ok := s.(string); ok { // invalid type assertion: s.(string) (non-interface type string on left)
fmt.Println(v)
}
}
我们可以使用类型断言,将一个类型为 interface{}
的变量,转换为基本数据类型或者复杂数据类型:
package main
import "fmt"
func main() {
var a interface{} = 10
t, ok := a.(int)
if ok {
fmt.Println("int", t)
}
t2, ok := a.(float32)
if ok {
fmt.Println("float32", t2)
}
}
在进行安全的类型断言时,可以使用两个参数来接收返回值,其中第一个参数是转换成功后的值,一个是 bool,用于指示这次类型转换是否成功(如果转换失败,则 v
为期待转换类型的默认值),比如:
package main
import "fmt"
func main() {
var s interface{} = "test"
v1, ok := s.(int)
if ok { // invalid type assertion: s.(string) (non-interface type string on left)
fmt.Println(v1)
}
fmt.Println(v1)
var s2 interface{} = 11
v2, ok := s2.(AAA)
if ok {
fmt.Println(v2)
}
fmt.Println(v2)
}
type AAA struct {
bb int
}
// output
0
{0}
...