查看接口变量
一、interface{}
- 表示任何类型
package main
import "fmt"
//返回任何类型
func getSum(s int) interface{} {
return s;
}
//接收任何类型
func getSum2(s interface{}) interface{} {
return s;
}
func main() {
fmt.Println("----------返回任何类型----------")
fmt.Println(getSum(123))
fmt.Println("----------接收任何类型----------")
fmt.Println(getSum2("S"))
}
输出:
----------返回任何类型----------
123
----------接收任何类型----------
S
二、Type Assertion (类型断言)
golang里的所有类型都实现了空接口interface{},所以通常将它作为一个函数的参数或者结构体的字段,以实现对类型的抽象。
2.1、用于转换函数里interface{}类型的参数
package main
import "fmt"
func main() {
getType(1)
getType(int16(1))
getType(float32(1.1))
getType(float64(1.1))
getType("1")
getType(true)
}
func getType(a interface{}) {
switch t := a.(type) {
case int:
//a.(int) 强转的意思
fmt.Println("int 类型,值是-->", a.(int))
case int16:
fmt.Println("int16 类型,值是-->", a.(int16))
case float32:
fmt.Println("float32 类型,值是-->", a.(float32))
case float64:
fmt.Println("float64 类型,值是-->", a.(float64))
case string:
fmt.Println("字符串 数字类型,值是-->", a.(string))
default:
fmt.Println("其他 类型,值是-->", t)
}
}
输出
int 类型,值是--> 1
int16 类型,值是--> 1
float32 类型,值是--> 1.1
float64 类型,值是--> 1.1
字符串 数字类型,值是--> 1
其他 类型,值是--> true
2.2、a.(type)只能和switch搭配使用。
在使用前得用断言指明变量的类型,如果断言错误就会触发panic。如果不想触发panic,先做判断再使用。
package main
import "fmt"
func main() {
a := int16(2)
getType(a)
}
func getType(a interface{}) {
_, ok := a.(int32)
if !ok {
fmt.Println("a 不是int32类型")
}
}
输出
a 不是int32类型
2.3、用于转换结构体的interface{}类型字段
例如,我们写handler去接收消息,不可能每个发来的消息都写个函数去handle。利用空接口和类型断言的特性,就可以将业务抽象出来
package main
import "fmt"
import "time"
type Message struct {
Id int16
Object interface{}
}
type Cat struct {
name string
age int16
}
type Dog struct {
name string
age int32
}
func main() {
msg1 := Message{1, Cat{"小猫", 1}}
msg2 := Message{2, Dog{"小狗", 8}}
message_handler(msg1)
time.Sleep(2000 * time.Millisecond)
message_handler(msg2)
time.Sleep(2000 * time.Millisecond)
}
func message_handler(msg Message) {
switch msg.Id {
case 1:
//强转
cat := msg.Object.(Cat)
fmt.Println("小猫类型:", cat)
case 2:
dog := msg.Object.(Dog)
fmt.Println("小狗类型:", dog)
default:
fmt.Println("其他类型", msg.Object)
}
}
输出
小猫类型: {小猫 1}
小狗类型: {小狗 8}