[golang] go的typeswitch guard(类型区别)语法和type assertion(类型断言)语法
最近在实现golang,看到个go的特性语法: typeswitch guard。
typeswitch guard语法如下:
package main
import "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)
[golang] go的typeswitch guard(类型区别)语法和type assertion(类型断言)语法的更多相关文章
- C++ c++与C语言的区别(struct类型的加强,函数-变量类型加强,bool类型)
//区别④:struct类型的加强(C++版本) #include<iostream> using namespace std; //C++中的struct是一个新类型的定义声明 //c+ ...
- set和enum类型的用法和区别
mysql中的set和enum类型的用法和区别 mysql中的enum和set其实都是string类型的而且只能在指定的集合里取值, 不同的是set可以取多个值,enum只能取一个值. 1 2 3 ...
- C语言中float,double类型,在内存中的结构(存储方式)
C语言中float,double类型,在内存中的结构(存储方式)从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以doubl ...
- css考核点整理(十三)-jpg/png/gif等图片类型区别
jpg/png/gif等图片类型区别
- ElasticSearch 学习记录之Text keyword 两种基本类型区别
ElasticSearch 系列文章 1 ES 入门之一 安装ElasticSearcha 2 ES 记录之如何创建一个索引映射 3 ElasticSearch 学习记录之Text keyword 两 ...
- 关于C语言中的Complex(复数类型)和imaginary(虚数类型)
关于C语言中的Complex(复数类型)和imaginary(虚数类型) 其实这里的复数complex就是数学里的复数,包含实部和虚部两个部分,比如:x=2.1+6i,下面进行详细介绍. C99 新增 ...
- JavaScript 简单类型和复杂类型区别
一.基本类型 1.概述 值类型又叫做基本数据类型,简单数据类型.在存储时,变量中存储的是值本身,因此叫做值类型 2.基本类型在内存中的存储 基本数据类型存储在栈区中. 3.基本类型作为函数的参数 基本 ...
- Java中的基本类型和包装类型区别
首先看一下几个测试题,验证一下java中对基本类型和包装类型的理解,看看最后输出的答案对不对,答案在这篇博客中哦: // 第一题: 基本类型和包装类型 int a = 100; Integer b = ...
- golang中值类型的嵌入式字段和指针类型的嵌入式字段
总结: 1. 值类型的嵌入式字段,该类型拥有值类型的方法集,没有值指针类型的方法集 2. 指针类型的嵌入式字段,该类型拥有值指针类型的方法集,没有值类型的方法集,并且,该类型的指针类型也有值指针类型的 ...
随机推荐
- Winform绑定图片的三种方式
1.绝对路径: this.pictureBox2.Image=Image.FromFile("D:\\001.jpg"); 2.相对路径: Application.StartupP ...
- cxf和axis2使用有感
CXF框架 个人不喜欢使用wsimport工具: 1.考虑到远端的服务接口发生变化,本地的接口还需要重新同步下 2.项目中无端多了些冗余的代码 这样我们选择cxf的动态调用接口吧,使用DynamicC ...
- obj.get_字段名称_display
在页面上我们只要这么写就可以直接把字典的值显示出来了 {{ obj.get_level_display }}({{ obj.level }}) obj.get_字段名称_display . model ...
- redis实现发布订阅
订阅者 #!/usr/bin/env python # -*- coding:utf-8 -*- import redis r = redis.Redis(host='192.168.11.119') ...
- EF的左连接查询
在EF中,当在dbset使用join关联多表查询时,连接查询的表如果没有建立相应的外键关系时,EF生成的SQL语句是inner join(内联),对于inner join,有所了解的同学都知道,很多时 ...
- 594. Longest Harmonious Subsequence强制差距为1的最长连续
[抄题]: We define a harmonious array is an array where the difference between its maximum value and it ...
- spring 框架jdbc连接数据库
user=LF password=LF url=jdbc:oracle:thin:@localhost:1521:orcl driver=oracle.jdbc.driver.OracleDriver ...
- opennebula kvm 创建VM oned报错日志
Thu Jul :: [ReM][D]: Req: UID: VirtualMachineDeploy result SUCCESS, Thu Jul :: [TM][D]: Message rece ...
- Qt5信号和槽机制
信号槽是 Qt 框架引以为豪的机制之一.熟练使用和理解信号槽,能够设计出解耦的非常漂亮的程序,有利于增强我们的技术设计能力. 所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被 ...
- 在CentOS6.x下安装Compiz——桌面立方体,特效种种
很多人貌似认为compiz必须要emerland,但事实上,没这个必要. compiz+gnome,实用,而又华丽,是个不错的选择. compiz需要显卡驱动,一般情况下不成问题(别忘了这是很新的ce ...