[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. 指针类型的嵌入式字段,该类型拥有值指针类型的方法集,没有值类型的方法集,并且,该类型的指针类型也有值指针类型的 ...
随机推荐
- js 判断浏览器类型大全
/**** * 目前识别范围 * Microsoft Internet Explorer IE浏览器 * --> TheWorld 世界之窗 * --> TT浏览器 * --> 36 ...
- CBV中的dispatch
之前介绍了FBV和CBV ,下面我们看一下CBV中的dispatch dispatch函数在类View中定义,作用就是通过反射查找get或post函数,所以在执行get或post函数之前,dispat ...
- IOS ipa安装不上 e8000087
iPhone5是32位的,所以按照64位编译出来的32位不支持,下面3种方案的,选择第3中就可以了. 5S是64位. e8000087: Your iOS device does not suppor ...
- Mongo实战之数据空洞的最佳实践
问题背景: 某天,开发部的同事跑过来反映: mongodb数据文件太大,快把磁盘撑爆了!其中某个db占用最大(运营环境这个db的数据量其实很小) 分析: 开发环境有大量测试的增/删/改操作,而由于Mo ...
- BurpSuite系列(十一)----Project options模块(项目选择)
一.简介 Project options主要用来对Project的一些设置. 二.模块说明 Project options主要由五个模块组成: 1.Connections 连接2.HTTP3.SSL4 ...
- Tornado 高并发源码分析之二---Tornado启动和请求处理流程
Tornado 服务器启动流程 因为Tornado 里使用了很多传类的方式,也就是delegate,之所以要这么做,其实和 iOS 开发那样,也很多的 delegate, 如此来实现高度解耦,但是比较 ...
- LibEvent代码阅读--多缓冲区和零拷贝技术
http://blog.chinaunix.net/uid-20937170-id-4827550.html
- resin3.X那些事之resin.conf
[经验总结]resin那些事之resin.conf ----by johnson 话说与resin打交道很久了,却从未系统了解过.resin一听火了,说:你老兄当真与我打交道很久了?工具.流程如此发达 ...
- wangEditor富文本编辑器
设置好了是这样的, 有一个ID问content的编辑框,方便获取,这里的富文本编辑器的版本是2.2 官方文档说3就不支持textarea了 导入一下css 记得css文件夹下应该又3个文件,虽然没有直 ...
- SQL语句性能分析常用命令
DBCC freeproccache DBCC dropcleanbuffers 1.set statistics IO {ON| OFF} /*Transact-SQL 语句生成的磁盘活动量的信息* ...