已知,空接口可以表示/接收任意类型,因此,空接口可以转换为预期的类型,以下介绍两种使用方法
-
将变量x,转换为指定类型
/* * 变量x,转换为指定类型,结果保存在y中 * @return ok 转换成功/失败 * y 转换后,x保存在y中 */ y, ok = x.(具体类型)
-
断言变量x的类型是什么
/* * 判断x的类型是什么,必须结合switch...case...一起使用 */ y, ok = x.(type)
示例代码
package main
import "fmt"
func typeCast(x interface{}) {
y, ok := x.(int) // 类型转换
fmt.Println(y, ok) // 0 false
z, ok1 := x.(string) // 类型转换
fmt.Println(z, ok1) // darren true
}
func switch_type_test(x interface{}) {
// 1.不能直接使用x.(type)
// fmt.Println(x.(type)) // 编译失败: use of .(type) outside type switch
// 2.正确的x.(type)使用方式: 与switch...case...
switch x.(type) {
case string:
fmt.Printf("x is string: %s\n", x)
case int:
fmt.Printf("x is int: %d\n", x)
}
}
func main() {
s := "darren"
typeCast(s)
switch_type_test(1)
switch_type_test("Tom")
}
执行结果:
0 false
darren true
x is int: 1
x is string: Tom
- 补充说明:结构体类型、指向结构体类型的指针是两种不同的类型
- 二者区别----指向结构体类型的指针,在打印表示上,有个取地址符&,表示它是一个指针
package main
import "fmt"
type Rect struct {
Width int
Height int
}
func main() {
var a interface{}
var r = Rect{50, 50}
a = &r
var rx = a.(*Rect) // a类型转换为: Rect*
fmt.Println("r:", r) // r: {50 50}
fmt.Println("rx:", rx) // rx: &{50 50}
}