2.08 Go之类型分支(switch判断空接口中变量的类型)
type-switch
特点:
可以判断空接口中值得类型,做类型得断言。语法如下:
/*
变量 t 得到了 areaIntf 的值和类型
*/
switch t := areaIntf.(type) {
case *Square:
fmt.Printf("Type Square %T with value %v\n", t, t)
case *Circle:
fmt.Printf("Type Circle %T with value %v\n", t, t)
case nil:
fmt.Printf("nil value: nothing to check?\n")
default:
fmt.Printf("Unexpected type %T\n", t)
}
/*
所有 case 语句中列举的类型(nil 除外)都必须实现对应的接口,如果被检测类型没有在 case 语句列举的类型中,就会执行 default 语句
如果跟随在某个 case 关键字后的条目为一个非接口类型(用一个类型名或类型字面表示),则此非接口类型必须实现了断言值 x 的(接口)类型
*/
类型断言书写格式
switch 接口变量.(type) {
case 类型1:
// 变量是类型1时的处理
case 类型2:
// 变量是类型2时的处理
…
default:
// 变量不是所有case中列举的类型时的处理
}
示例:使用类型分支判断基本类型
package main
import "fmt"
/* 打印类型的方法--->使用类型断言 */
func printType(v interface{}) {
switch v.(type) {
case int:
fmt.Println(v, "is int!")
case string:
fmt.Println(v, "is string!")
case bool:
fmt.Println(v, "is boolean!")
default:
fmt.Println(v, "is unknowtype!")
}
}
/* 调用函数 */
func main() {
printType(1024)
printType("HelloWorld!")
printType(false)
}
使用类型分支判断接口类型
多个接口进行类型断言时,可以使用类型分支简化判断过程
示例代码:
package main
import "fmt"
/* 定义具备刷脸特性的接口 */
type ContainCanUseFaceId interface {
CanUseFaceId()
}
/* 定义具备偷窃特性的接口 */
type ContainStolen interface {
Stolen()
}
/* 定义刷脸支付类型 */
type Alipay struct {
}
// 刷脸支付类型实现刷脸特性接口定义的函数
func (a *Alipay) CanUseFaceId() {
}
/* 定义现金支付类型 */
type Cash struct {
}
// 现金支付类型实现偷窃特性接口定义的函数
func (c *Cash) Stolen() {
}
/* 定义根据接口类型进行类型断言的函数 */
func print(payMethod interface{}) {
switch payMethod.(type) {
case ContainCanUseFaceId: // 这里判断的是接口的类型,所以case后+的是接口名称
fmt.Println("支持刷脸支付!")
case ContainStolen:
fmt.Println("可能被偷窃!")
default:
fmt.Println("未知什么类型的接口!")
}
}
// 调用print方法
func main() {
print(new(Cash))
print(new(Alipay))
print(new(Cash))
}
It's a lonely road!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)