博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[golang] go的typeswitch guard(类型区别)语法和type assertion(类型断言)语法
阅读量:5098 次
发布时间:2019-06-13

本文共 1889 字,大约阅读时间需要 6 分钟。

最近在实现golang,看到个go的特性语法: typeswitch guard。

typeswitch guard语法如下:

package mainimport "fmt"func typeChecking(p interface{}) {    switch p.(type) {    case int:        fmt.Print("int")    case float64:        fmt.Printf("float64")    }}func main(){    typeChecking(56.67)        typeChecking(56)}

运行时判断p的类型,并根据是什么类型进行对应操作,较之与其他语言比如java的连续if else在语法上要美观一些:

if(p instance of TypeA){    System.out.println("Type A");}else if (p instance of TypeB){    System.out.println("Type B");}...

另外需要注意它的参数只能是interface,因为其他类型都可以被编译器编译时type inference,只有interface具有运行时类型。

最后可以看到,类型区别语法和类型断言很像的,仅在于p.(X)括号内不是type关键字而是类型。

如果类型正确那么程序正常,如果类型错误则panic

func typeAssertion(p interface{}){    q:=p.(int)    fmt.Print(q)}func main(){    typeAssertion(5.7)}

上述例子如果p的类型是int,那么正常输出;如果不是则painc。

既然实现golang,就多说一点点

typeswitch 在golang 1.11对应的ast 结构如下:

TypeSwitchGuard struct {    Lhs *Name // nil means no Lhs :=    X   Expr  // X.(type)    expr}

也就是说typeswitch guard其实是有两种语法的:

X.(type)Lhs := X.(type)

我们可以将typeswitch guard的值赋给一个变量,变量的值相当于p本身的值:

func typeChecking(p interface{}) {    switch q :=p.(type) {    case int:        fmt.Print("int")    case float64:        fmt.Print(q)        fmt.Printf("float64")    }}func main(){    typeChecking(56.67)}

最后输出

56.67float64

前面说到它的语法和type assertion也非常类似,这是有原因的。编译器区分两者仅在于p.(X)括号内是否为关键字type

case _Lparen:                p.next()                if p.got(_Type) {//如果括号内是关键字type则是typeswitch,否则便是type assertion                    t := new(TypeSwitchGuard)                    // t.Lhs is filled in by parser.simpleStmt                    t.pos = pos                    t.X = x                    x = t                } else {                    t := new(AssertExpr)                    t.pos = pos                    t.X = x                    t.Type = p.type_()                    x = t                }                p.want(_Rparen)

转载于:https://www.cnblogs.com/ysherlock/p/9794542.html

你可能感兴趣的文章
ionic2+ 基础
查看>>
查询消除重复行
查看>>
[leetcode]Minimum Path Sum
查看>>
内存管理 浅析 内存管理/内存优化技巧
查看>>
Aizu - 1378 Secret of Chocolate Poles (DP)
查看>>
csv HTTP简单表服务器
查看>>
IO流写出到本地 D盘demoIO.txt 文本中
查看>>
Screening technology proved cost effective deal
查看>>
mysql8.0.13下载与安装图文教程
查看>>
Thrift Expected protocol id ffffff82 but got 0
查看>>
【2.2】创建博客文章模型
查看>>
Kotlin动态图
查看>>
从零开始系列之vue全家桶(1)安装前期准备nodejs+cnpm+webpack+vue-cli+vue-router
查看>>
Jsp抓取页面内容
查看>>
大三上学期软件工程作业之点餐系统(网页版)的一些心得
查看>>
可选参数的函数还可以这样设计!
查看>>
[你必须知道的.NET]第二十一回:认识全面的null
查看>>
Java语言概述
查看>>
关于BOM知识的整理
查看>>
使用word发布博客
查看>>