三:Go编程语言规范-表达式
1.限定标识符
限定标识符为使用包名前缀限定的标识符。包名与标识符均不能为空白的。限定标识符用于访问另一个包中的标识符,它必须被导入。 标识符必须是已导出且在该包的包块中声明。
math.Sin // 表示math包中的Sin函数
2.函数字面
函数字面可赋予一个变量或直接调用。
f := func(x, y int) int { return x + y }
func(ch chan int) { ch <- ACK }(replyChan)
闭包 的函数字面:它们可引用定义在外围函数中的变量。 那些变量共享于外围函数与函数字面之间,并且只要它们可访问就会继续存在。
3.选择器 .
对于不为包名的主表达式 x,选择器表达式为,
x.f
选择者会自动解引用指向结构的指针。 若 x 为指向结构的指针,x.y 即为 (*x).y 的缩写; 若字段 y 亦为指向结构的指针,x.y.z 即为 (*(*x).y).z 的缩写, 以此类推。 若 x 包含类型为 *A 的匿名字段,且 A 亦为结构类型, x.f 即为 (*x.A).f 的缩写。
p.z // (*p).z
p.y // ((*p).T1).y
p.x // (*(*p).T0).x p.M2() // (*p).M2()
p.M1() // ((*p).T1).M1()
p.M0() // ((*p).T0).M0()
4.下标表达式
形式为:a[x]
5.切片
对于数组或字符串,若 0 <=  下标 low <= high <= len(a)low 和 high 即在界内,否则即在界外。 对于切片,其上界为该切片的容量 cap(a) 而非长度。常量下标必为非负值, 且可表示为 int 类型的值。若其下标也为常量,它们必定满足 low <= high。 若 a 为 nil 或其下标在运行时越界,就会引发一个运行时恐慌。
a[low : high]
6.类型断言
对于接口类型的表达式 x 与类型 T,主表达式x.(T),注意x必须为接口类型
var x interface{} = 7 // x 拥有动态类型 int 与值 7
i := x.(int) // i 拥有类型 int 与值 7 type I interface { m() }
var y I
s := y.(string) // 非法:string 没有实现 I(缺少方法 m)
r := y.(io.Reader) // r 拥有 类型 io.Reader 且 y 必须同时实现了 I 和 io.Reader更确切地说,若
T为非接口类型,x.(T)断言x的动态类型 与T相同。在此情况下,T必须实现x的(接口)类型,除非其类型断言由于无法为x存储类型为T的值而无效。若T为接口类型,x.(T)则断言x的动态类型实现了接口T。若该类型断言成立,该表达式的值即为存储于
x中的值,且其类型为T。若该类型断言不成立, 就会出现一个运行时恐慌。换句话说,即使x的动态类型只能在运行时可知,在正确的程序中,x.(T)的类型也可知为T。若类型断言以
v, ok = x.(T)
v, ok := x.(T)
var v, ok = x.(T)若该断言成立,该表达式返回值对 (x.(T), true);否则,该表达式返回 (Z, false), 其中 Z 为类型为 T 的零值。此种情况不会产生运行时恐慌。 类型断言在这种构造中,其行为类似于函数调用返回一个值与一个布尔值以表示成功。
7.比较操作符
在任何比较中,第一个操作数必须为可赋予第二个操作数的类型,反之亦然。
相等性操作符 == 和 != 适用于可比较操作数。 顺序操作符 <、<=、> 和 >= 适用于有序的操作数。这些比较操作的关系和值定义如下:
- 布尔值之间可比较。若两个布尔值同为 
true或同为false,它们即为相等。 - 通常情况下,整数值之间可比较或排序。
 - 根据 IEEE-754 标准的定义,浮点数值之间可比较或排序。
 - 复数值之间可比较。对于两个复数值 
u与v, 若real(u) == real(v)且imag(u) == imag(v),它们即为相等。 - 根据按字节词法,字符串值之间可比较或排序。
 - 指针值之间可比较。若两个指针指向相同的值或其值同为 
nil,它们即为相等。 指向明显为零大小变量的指针可能相等也可能不相等。 - 信道值可比较。若两个信道值通过相同的 
make调用 (§创建切片、映射和信道)创建或同为nil值,它们即为相等。 - 接口值可比较。若两个接口值拥有相同的动态类型与相等的动态值,或同为 
nil值,它们即为相等。 - 当非接口类型 
X的值可比较且X实现了T时, 非接口类型X的值x与接口类型T的值t则可比较。 若t的动态类型与X相同且t动态值等于x,它们即为相等。 - 若两个结构值的所有字段可比较,它们即可比较。若其相应的非空白字段相等,它们即为相等。
 - 若两个数组元素类型的值可比较,则数组值可比较。若其相应的元素相等,它们即为相等。
 
- 布尔值之间可比较。若两个布尔值同为 
 
8.地址操作符
对于类型为 T 的操作数 x,地址操作符 &x 将生成一个类型为 *T 的指针指向 x。对于指针类型为 *T 的操作数 x,间接指针 *x 表示类型为 T 的值指向 x。若 x 为 nil, 尝试求值 *x 将会引发运行时恐慌。
&x
&a[f(2)]
&Point{2, 3}
*p
*pf(x)
9.接收操作符
v1 := <-ch
v2 = <-ch
f(<-ch)
<-strobe // 在时钟脉冲和丢弃接收值之前等待x, ok = <-ch
x, ok := <-ch
var x, ok = <-ch若接收的值由一次成功向信道发送的操作发出的,则 ok 的值为 true; 若接收的值是由于信道被关闭或为空而产生的零值,则为 false。
10.类型转换
类型转换是形式为 T(x) 的表达式,其中 T 为类型,而 x 是可转换为类型 T 的表达式。
若类型以操作符 *、<- 或关键字 func 开始则必须加上括号:
*Point(p) // 等价于 *(Point(p))
(*Point)(p) // p 被转换为 (*Point)
<-chan int(c) // 等价于 <-(chan int(c))
(<-chan int)(c) // c 被转换为 (<-chan int)
func()(x) // 函数签名 func() x
(func())(x) // x 被转换为 (func())
三:Go编程语言规范-表达式的更多相关文章
- 作业三:代码规范、代码复审、PSP
		
一.代码规范 我认为我们编写的代码都需要进行规范的操作,因为如果为了图省事情或者为了减少时间去完成这个编程.在最后检验的时候就会出现一些警告,导致你这次编程的代码出现问题,当出现问题的时候你在回头去检 ...
 - 二:Go编程语言规范-类型
		
1.类型 布尔值,数值与字符串类型的实例的命名是预声明的. 数组,结构,指针,函数,接口,切片,映射和信道这些复合类型可由类型字面构造. 每个类型 T 都有一个 基本类型:若 T 为预声明类型或类型字 ...
 - 一:Go编程语言规范--块、声明、作用域
		
1.块 块为一对大括号括住的声明和语句.块 = "{" { 语句 ";" } "}" . 除显式源码块外,还有隐式块: 全域块 包含所有的G ...
 - JAVA 8 主要新特性 ----------------(三)新功能Lambda表达式入门
		
一.简述 Java为了扩充匿名方法在1.8中新追加的特性.本身Java之前的版本是没有匿名方法的,只有匿名对象. 二.使用 Java中使用匿名方法必须要对应接口中的一个抽象方 ...
 - 读书笔记,《Java 8实战》,第三章,Lambda表达式
		
第一节,Lambda管中窥豹 可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式,它没有名称,但它有参数列表.函数主题和返回值. 本节介绍了Lambda表达式的语法,它包括 ...
 - Git(三):Git 使用规范流程
		
转:http://www.ruanyifeng.com/blog/2015/08/git-use-process.html 团队开发中,遵循一个合理.清晰的Git使用流程,是非常重要的. 否则,每个人 ...
 - AMD,CMD,UMD 三种模块规范 写法格式
		
一下三块均以 foo.js 为示例文件名,以 jQuery,underscore 为需求组件 ADM:异步模块规范, RequireJs 的支持格式 // 文件名: foo.js define(['j ...
 - Nhibernate系列学习之(三) Criteria查询表达式增删改查
		
Criteria查询表达式: 正如我们所见,Expression对查询语句的表达式进行了封装和限制,下表列出了Expression所有的方法,以及每个方法所对应的查询表达式及其限制. Restrict ...
 - Jsp2.0自定义标签(第三天)——EL表达式的使用
		
1.提出问题: 我们经常会看到这样的jsp页面代码: 浏览器显示: 为什么会在页面输出:Hello World ,${per}究竟是如何找到“Hello World”的呢? 2.分析问题: 要想解决 ...
 
随机推荐
- shiro realm 注解失败问题解决过程
			
做为一名在.net混了八九年的老兵油子,转战java时间并不长,刚开始做项目完全是凭借对C#的认识来做,虽然遇到一些问题,但实际结果显示C#在语言上和java还是有很大相似度,而且微软的MVC与Spr ...
 - 管理系统-------------SSH框架书写登录和显示用户
			
一.思路的穿插. web.xml中的配置找到--->application.xml---->找到对应的Action---->找到struts.xml----->在去找actio ...
 - JavaScript基础------入门基础
			
JavaScript他是一种描述性语言,使用JavaScript就是为了能和网页有更好的交互,下面切入主题进行讲解. 一.JavaScript 1.什么是JavaScript JavaScript是一 ...
 - Redis学习笔记2-使用 Redis 作为 LRU 缓存
			
当 Redis 作为缓存使用时,当你添加新的数据时,有时候很方便使 Redis 自动回收老的数据.LRU 实际上是被唯一支持的数据移除方法.Redis 的 maxmemory 指令,用于限制内存使用到 ...
 - 以【猫叫、老鼠跑、主人醒】为例子,使用 javascript 来实现 观察者模式 (有在线演示)
			
“猫叫.老鼠跑.主人醒”是一个很古老的话题了,大家也都有各自的想法和解决方案.我也是看了很多,一开始的时候是相当的迷糊,这个怎么就是面试题了?考的是啥呀,和编程有关系吗?又是猫又是老鼠的,晕死了.后来 ...
 - ASP.NET登录控件login。
			
1.Login控件.通常情况下会出现3个核心元素.用户名文本框.密码输入框.提交凭证的按钮. 1>.比较重要的属性:CreateUserText属性:包含站点注册页的链接文本.CreateUse ...
 - Ajax中get和post使用问题
			
使用get遇到的问题: 1.问题一. 缓存:当每次访问的url相同,客户端直接读取本地缓存里面的内容,即使后台数据变化前台也不会有变化: 解决方法:在?后面链接一个num=[随机数Math.rando ...
 - Node入门
			
一 node定位 Node.js是一个事件驱动I/O服务端JavaScript环境,是一个基于Google的V8引擎的Chrome JavaScript 运行时建立的一个平台. 二 node安装 (1 ...
 - SharePoint 2013 Error - TypeError: Unable to get property 'replace' of undefined or null reference
			
错误信息 TypeError: Unable to get property ‘replace’ of undefined or null referenceTypeError: Unable to ...
 - DevExpress .NET界面开发示例大全
			
说到做.net界面开发,很多人应该都会想到DevExpress. 它的 .net界面开发系列一共有7个版本:WinForms.ASP.NET.MVC.WPF.Silverlight.Windows 8 ...