基本介绍
类型断言,由于接口(interface)是一般类型,不知道具体类。如果要转成具体类型,就需要使用类型断言
基本使用
package main
import "fmt"
type Person struct {
Name string
}
func main() {
var a interface{} // 空接口
person := Person{
Name: "宋江",
}
a = person // Person结构体类型可直接赋值给空接口,因为空接口也接受任何数据类型
fmt.Println(a)
var person2 Person
// person2 = a // 错误!接口类型不能直接复制给Person结构体类型,需要使用类型断言
person2, ok := a.(Person) // (Person)就是类型断言,ok变量接受是否转换成功,成功true 失败false
if ok {
fmt.Printf("转换成功,type=%T,person2=%v\n", person2, person2)
} else {
fmt.Println("转换失败")
}
}
![](https://img-blog.csdnimg.cn/img_convert/560a9b9a2c1bdfd55e92f6b997f1008b.png)
类型断言的最佳实践一
package main
import "fmt"
type Usb interface {
Start()
Stop()
}
type Computer struct {
}
func (computer Computer) Working(usb Usb) {
usb.Start()
// 类型断言的引用,当Usb接口为手机时调用Call()
if phone, ok := usb.(Phone); ok {
phone.Call()
}
usb.Stop()
}
type Phone struct{}
func (phone Phone) Start() {
fmt.Println("手机开始工作...")
}
func (phone Phone) Stop() {
fmt.Println("手机停止工作...")
}
func (phone Phone) Call() {
fmt.Println("手机打电话...")
}
type Camera struct{}
func (camera Camera) Start() {
fmt.Println("相机开始工作...")
}
func (camera Camera) Stop() {
fmt.Println("相机停止工作...")
}
func main() {
phone := Phone{}
camera := Camera{}
computer := Computer{}
computer.Working(phone)
computer.Working(camera)
}
![](https://img-blog.csdnimg.cn/img_convert/7aa09c18fc3c29484ef0073fc7a4aa2f.png)
类型断言的最佳实践二
package main
import "fmt"
type Person struct{}
func TypeAnalyse(items ...interface{}) {
for index, value := range items {
index += 1
switch value.(type) {
case bool:
fmt.Printf("第%d行参数类型是bool,值%v\n", index, value)
case string:
fmt.Printf("第%d行参数类型是string,值%v\n", index, value)
case int, int32, int64:
fmt.Printf("第%d行参数类型是整数,值%v\n", index, value)
case float32, float64:
fmt.Printf("第%d行参数类型是浮点,值%v\n", index, value)
case Person:
fmt.Printf("第%d行参数类型是Person,值%v\n", index, value)
case *Person:
fmt.Printf("第%d行参数类型是*Person,值%v\n", index, value)
}
}
}
func main() {
var n1 int = 100
var n2 float32 = 200.00
n3 := "鲁智深"
n4 := Person{}
n5 := &Person{}
n6 := true
TypeAnalyse(n1, n2, n3, n4, n5, n6)
}
![](https://img-blog.csdnimg.cn/img_convert/96c726414447584148d7d96f2e02056a.png)