Go:类型断言
2024-10-03 00:12:48
一、基本介绍
类型断言:由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言。
如果希望将一个空接口类型重新转换成对应的类型,那么需要使用类型断言,能转换成功是因为这个空接口原先是指向这个类型的。
type Point struct {
x int
y int
} func main() {
var a interface{}
var p = Point{1, 2}
a = p // 这是可以的
var b Point
//b = a // 这时不可以的,要使用断言,如下
b = a.(Point) // 这就是类型断言,表示看看能不能将 a 转换成 Point,再赋给 b
c := a.(Point)
fmt.Println(b) // {1 2}
fmt.Printf("c的类型=%T,值=%v", c, c) // c的类型=main.Point,值={1 2}
}
二、带检测的类型断言
在进行类型断言时,如果类型不匹配,就会报 panic,因此在进行类型断言时,需要检测机制,如果成功就继续执行,否则不要报 panic。
type Point struct {
x int
y int
} func main() {
var a interface{}
var p = Point{1, 2}
a = p
b, ok := a.(int) // 肯定转换失败的,如果是string,则 b 为空
if ok{
fmt.Println("转换成功")
} else {
fmt.Println("转换失败") // 转换失败
}
fmt.Println(b) // 0
}
三、类型断言最佳实践
示例1:
type Usb interface {
Connect()
Disconnect()
} type Phone struct {Name string}
type Camera struct {Name string}
func (p Phone) Connect() {fmt.Printf("%s连接中...\n", p.Name)}
func (p Phone) Disconnect() {fmt.Printf("%s断开连接中...\n", p.Name)}
func (c Camera) Connect() {fmt.Printf("%s连接中...\n", c.Name)}
func (c Camera) Disconnect() {fmt.Printf("%s断开连接中...\n", c.Name)}
// Phone结构体特有的方法Call
func (p Phone) Call() {fmt.Printf("正在使用%s打电话,..\n", p.Name)} type Computer struct {}
func (c Computer) Working(usb Usb) {
usb.Connect()
usb.Disconnect()
// 如果 usb 是指向 Phone 结构体变量,则还需要调用 Call 方法
phone, ok := usb.(Phone) // 类型断言
if ok {
phone.Call()
}
} func main() {
// 定义一个 Usb 接口数组,可以存放 Phone 和 Camera 结构体的实例
var usbArr [2]Usb
usbArr[0] = Phone{"苹果"}
usbArr[1] = Camera{"尼康"}
var computer Computer
for _, v := range usbArr {
computer.Working(v)
}
fmt.Println()
fmt.Println(usbArr)
}
示例2:
type Student struct {} func TypeJudge(args... interface{}) {
for i, v := range args {
switch v.(type) {
case int, int8, int16, int32, int64:
fmt.Printf("第%v个参数是 整数 类型,值是%v\n", i, v)
case float32:
fmt.Printf("第%v个参数是 float32 类型,值是%v\n", i, v)
case float64:
fmt.Printf("第%v个参数是 float64 类型,值是%v\n", i, v)
case bool:
fmt.Printf("第%v个参数是 bool 类型,值是%v\n", i, v)
case string:
fmt.Printf("第%v个参数是 string 类型,值是%v\n", i, v)
case Student:
fmt.Printf("第%v个参数是 Student 类型,值是%v\n", i, v)
case *Student:
fmt.Printf("第%v个参数是 *Student 类型,值是%v\n", i, v)
default:
fmt.Printf("第%v个参数的类型未知,值是%v\n", i, v)
}
}
} func main() {
var a int = 1
var b float32 = 2.2
var c float64 = 3.3
var d bool = true
var e Student
var f *Student
TypeJudge(a, b, c, d, e, f)
}
最新文章
- android listView嵌套gridview的使用心得
- 学习cocos code ide 的lua编程
- short-path problem (Dijkstra) 分类: ACM TYPE 2014-09-01 23:51 111人阅读 评论(0) 收藏
- 不只是技术!成为IT经理必备的十大软技能
- Unity3d 播放高质量视频解决方案
- 关于python文件转为exe文件
- c语言,enum
- 如何把一个c语言程序做成windows服务开机自启动
- Xcode出现may cause a leak非忽略的解决方法
- 安装CentOs 7.3
- tcpdump常用参数说明及常见操作
- Django——图书管理系统
- 在Javascript中数组对象(json)里元素相同的操作
- Java和.NET(C#)的开发用到的技术对比总结
- 第一个java程序的编译
- dmesg七种用法
- MySQL_join连接
- 2018软件工程W班助教小结博客
- BZOJ1461 字符串的匹配
- 读《锋利的jQuery》中first-child时的一个细节