示例
assert.go
package main
import "fmt"
type Point struct {
x int
y int
}
func main() {
var a interface{}
var point Point = Point{1, 2}
a = point
var b Point
b = a.(Point) //类型断言
fmt.Println(b)
}
执行结果:
{1 2}
说明:在进行类型断言时,如果类型不匹配,就会报 panic,因此进行类型断言时,要确保原来的空接口指向的就是断言的类型。
类型断言检测
assert.go
package main
import (
"fmt"
)
func main() {
var x interface{}
var b float32 = 2.1
x = b
if y, ok := x.(float32); ok {
fmt.Printf("y 的类型是 %T 值是=%v \n", y, y)
} else {
fmt.Println("convert fail")
}
}
运行结果:
y 的类型是 float32 值是=2.1
最佳实践1
assert.go
package main
import "fmt"
// 定义一个接口
type Usb interface {
// 声明两个没有实现的方法
Start()
Stop()
}
type Phone struct {
Name string
}
// 让Phone 实现Usb接口的方法
func (p Phone) Start() {
fmt.Println("手机开始工作。。。")
}
func (p Phone) Stop() {
fmt.Println("手机停止工作。。。")
}
func (p Phone) Call() {
fmt.Println("手机打电话。。。")
}
type Camera struct {
Name string
}
// 让 Camera 实现Usb接口的方法
func (p Camera) Start() {
fmt.Println("相机开始工作。。。")
}
func (p Camera) Stop() {
fmt.Println("相机停止工作。。。")
}
// 计算机
type Computer struct {
}
// 编写一个方法 Working 方法,接收一个Usb接口类型的变量
// 只要实现了Usb 接口(所谓实现 Usb 接口,就是指实现了 Usb 接口声明所有方法)
func (c Computer) Working(usb Usb) { // usb 变量会根据传入的实参,来判断到底是Phone,还是camera
// 通过 usb 接口变量来调用 Start 和 Stop 方法
usb.Start()
usb.Stop()
//类型断言
if phone, ok := usb.(Phone); ok {
phone.Call()
}
}
func main() {
var usbArr [3]Usb
usbArr[0] = Phone{"Vivo"}
usbArr[1] = Phone{"小米"}
usbArr[2] = Camera{"尼康"}
var computer Computer
for _, v := range usbArr {
computer.Working(v)
fmt.Println()
}
}
执行结果:
手机开始工作。。。 手机停止工作。。。 手机打电话。。。 手机开始工作。。。 手机停止工作。。。 手机打电话。。。 相机开始工作。。。 相机停止工作。。。
最佳实践2
assert.go
package main
import "fmt"
type Student struct{}
func TypeJudge(items... interface{}) {
for k, v := range items {
switch v.(type) {
case bool:
fmt.Printf("第%v个参数是 bool 类型, 值是%v \n", k, v)
case float32:
fmt.Printf("第%v个参数是 float32 类型, 值是%v \n", k, v)
case float64:
fmt.Printf("第%v个参数是 float64 类型, 值是%v \n", k, v)
case int, int32, int64:
fmt.Printf("第%v个参数是 整数 类型, 值是%v \n", k, v)
case string:
fmt.Printf("第%v个参数是 string 类型, 值是%v \n", k, v)
case Student:
fmt.Printf("第%v个参数是 Student 类型, 值是%v \n", k, v)
case *Student:
fmt.Printf("第%v个参数是 *Student 类型, 值是%v \n", k, v)
default:
fmt.Printf("第%v个参数是 类型 不确定, 值是%v \n", k, v)
}
}
}
func main() {
var n1 float32 = 1.1
var n2 float64 = 2.1
var n3 int = 30
var name string = "tome"
address := "北京"
n4 := 300
stu1 := Student{}
stu2 := new(Student)
TypeJudge(n1, n2, n3, name, address, n4, stu1, stu2)
}
执行结果:
第0个参数是 float32 类型, 值是1.1
第1个参数是 float64 类型, 值是2.1
第2个参数是 整数 类型, 值是30
第3个参数是 string 类型, 值是tome
第4个参数是 string 类型, 值是北京
第5个参数是 整数 类型, 值是300
第6个参数是 Student 类型, 值是{}
第7个参数是 *Student 类型, 值是&{}