《Go并发编程实战》读书笔记-语法概览

                                       作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

  本篇博客我们会快速浏览一下Go的语法,内容涉及基本构成要素(比如标识符,关键字,子面量,操作符等)和基本类型(比如bool,byte,rune,int,string等),高级类型(比如数组,切片,字典,接口,结构体等)和流程控制语句(if,switch,for,defer等)。

一.基本构成要素

  Go的语言符号又称为词法元素,共包括5类内容,即标识符(identifier),关键字(keyword),字面量(literal),分隔符(delimiter)和操作符(operator),它们可以组成各种表达式和语句,而后者都无需以分号结尾。

1>.标识符(identifier)

  标识符可以表示程序实体,前者即为后者的名称。在一般情况下,同一个代码块中不允许出现同名的程序实体。使用不同代码包中的程序实体需要用到限定标识符,比如:“os.0_RDONLY”。

  另外,Go中还存在着一类特殊的标识符,叫作定义标识符,他们是在Go源码中声明的。这类标识符包括以下几种:

    第一:所有基本数据类型的名称;

    第二:接口类型error;

    第三:常量true,false和iota;

  所有内建函数的名称,即:append,cap,close,complex,copy,delete,imag,len,make,new,panic,print,println,real和recover。这里强调一下空标识符,它由一个下划线("_")表示,一般用在变量声明或代码包导入语句中。若在代码中存在一个变量“x”,但是却不存在任何对它的使用,则编译器会报错。如果在变量“x”的声明代码后添加这样一行代码:“ _ = x”就可以绕过编译器检查,使它不产生任何编译错误。这是因为这段代码确实用到了变量“x”,只不过它没有在变量“x”上进行任何操作,也没有将它复制给任何变量。空标识符就像一个垃圾桶。在相关初始化工作完成之后,操作对象就会被弃之不用。

2>.关键字(keyword)

  关键字是指被编程语言保留的字符序列,编程人员不能把它们用作标识符。因此,关键字也称为保留字。

  Go的关键字可以分为3类,包括用于程序声明的关键字,用于程序实体声明和定义的关键字,以及用于程序流程控制的关键字,如下所示:

    程序声明: “improt”和“package”。

    程序实体声明和定义:“chan”,“const”,“func”,“interface”,“map”,“struct”,“type”和“var”。

    程序流程控制:“go”,“select”,“break”,“case”,“continue”,“default”,“defer”,“else”,“fallthrough”,“for”,“goto”,“if”,“range”,“return”和“switch”。

  Go的关键字共有25个,其中与并发编程有关的关键字又go,chan和select。

  这里特别说明一下关键字type的用途,即类型声明。我们可以使用它声明一个自定义的类型,如“type myString string”这里把名为myString的类型声明为string类型的一个别名类型。反过来说,string类型是myString类型的潜在类型。在看另一个例子,基本数据类型rune是int32类型的一个别名类型,int32类型就是rune的潜在类型。虽然类型及其潜在类型是不同的两个类型,但是他们的值可以进行类型转换,例如:string(myString("ABCD"))。这样的类型转换不会产生新值,几乎没声明代价。

  自定义的类型一般都会基于Go中的一个或多个预定义类型,就想上面的myString和string那样。如果为自定义类型关联若干方法(函数的变体),那么还可以让它成为某个或某些接口类型的实现类型。另外,还有一个比较特殊的类型,叫空接口。它的类型字面量是“interface{}”,在Go语言中,任何类型都是空接口类型的实现类型。

3>.字面量(literal)

  简单来说,字面量就是值的一种标记法。但是,在Go中,字面量的含义要更加广泛一些。我们常常用到的字面量有以下三类:

    第一:用于表示基础类型值的各种字面量。这是最常用到的一类字面量,例如表示浮点数类型值的“12E-3”。

    第二:用于构造各种自定义的复合数据类型的类型字面量,例如下面定义了一个名称为Name的结构体类型:        

type MyName struct {
Id int
Name string
}

    第三:用于表示复合数据类型的值的复合字面量,它可以用来构造struct(结构体),array(数组),slice(切片)和map(字典)类型的值。复合字面量一般有字面类型以及被花括号包裹的复合元素的列表组成。字面类型指的就是复合数据类型的名称。例如,下面的复合字面量构造了一个MyName 类型的值,其中MyName表示这个值的类型,紧随其后的就是由键值对表示的复合元素列表。

package main

type MyName struct {
Id int
Name string
} func main() { yzj := MyName{
Id:,
Name:"尹正杰",
} println(yzj.Id)
println(yzj.Name) }

4>.操作符(operator)

5>.表达式

二.基本类型

三.高级类型

四.流程控制语句

《Go并发编程实战》读书笔记-语法概览的更多相关文章

  1. Java并发编程实战 读书笔记(一)

    最近在看多线程经典书籍Java并发变成实战,很多概念有疑惑,虽然工作中很少用到多线程,但觉得还是自己太弱了.加油.记一些随笔.下面简单介绍一下线程. 一  线程与进程   进程与线程的解释   个人觉 ...

  2. Java并发编程实战 读书笔记(二)

    关于发布和逸出 并发编程实践中,this引用逃逸("this"escape)是指对象还没有构造完成,它的this引用就被发布出去了.这是危及到线程安全的,因为其他线程有可能通过这个 ...

  3. 《java并发编程实战》笔记

    <java并发编程实战>这本书配合并发编程网中的并发系列文章一起看,效果会好很多. 并发系列的文章链接为:  Java并发性和多线程介绍目录 建议: <java并发编程实战>第 ...

  4. Java多线程编程实战读书笔记(一)

    多线程的基础概念本人在学习多线程的时候发现一本书——java多线程编程实战指南.整理了一下书中的概念制作成了思维导图的形式.按照书中的章节整理,并添加一些个人的理解.

  5. Java并发编程实践读书笔记(5) 线程池的使用

    Executor与Task的耦合性 1,除非线程池很非常大,否则一个Task不要依赖同一个线程服务中的另外一个Task,因为这样容易造成死锁: 2,线程的执行是并行的,所以在设计Task的时候要考虑到 ...

  6. Java并发编程实践(读书笔记) 任务执行(未完)

    任务的定义 大多数并发程序都是围绕任务进行管理的.任务就是抽象和离散的工作单元.   任务的执行策略 1.顺序的执行任务 这种策略的特点是一般只有按顺序处理到来的任务.一次只能处理一个任务,后来其它任 ...

  7. Java并发编程实践读书笔记(2)多线程基础组件

    同步容器 同步容器是指那些对所有的操作都进行加锁(synchronize)的容器.比如Vector.HashTable和Collections.synchronizedXXX返回系列对象: 可以看到, ...

  8. C++并发编程实战---阅读笔记

    1. 当把函数对象传入到线程构造函数中时,需要避免“最令人头痛的语法解析”.如果传递了一个临时变量,而不是一个命名的变量:C++编译器会将其解析为函数声明,而不是类型对象的定义. 例如: class ...

  9. Java并发编程艺术读书笔记

    1.多线程在CPU切换过程中,由于需要保存线程之前状态和加载新线程状态,成为上下文切换,上下文切换会造成消耗系统内存.所以,可合理控制线程数量. 如何控制: (1)使用ps -ef|grep appn ...

随机推荐

  1. kubernetes 基本命令

    查询命令: kubectl get pods -n kube-system kubectl get ClusterRole -n kube-system kubectl get ClusterRole ...

  2. Codeforces Round #507 Div. 1

    D:类似于noip2018d1t3,子树内的链应该贪心的尽量合并而不是拆开.则设f[i]为i子树内满足选的链尽量多的情况下根所在的链的最长长度即可.于是可以线性对某个k求得答案. 注意到长度为k的链不 ...

  3. Codeforces997D Cycles in product 【FFT】【树形DP】

    题目大意: 给两个树,求环的个数. 题目分析: 出题人摆错题号系列. 通过画图很容易就能想到把新图拆在两个树上,在树上游走成环. 考虑DP状态F,G,T.F表示最终答案,T表示儿子不考虑父亲,G表示父 ...

  4. Codeforces510 C. Fox And Names

    Codeforces题号:#510C 出处: Codeforces 主要算法:判环+拓扑 难度:4.2 思路分析: 要是把这道题联系到图上就很容易想了. 如何建图?由于最后要求名字满足字典序,所以不妨 ...

  5. 【AGC018F】Two Trees 构造 黑白染色

    题目描述 有两棵有根树,顶点的编号都是\(1\)~\(n\). 你要给每个点一个权值\(a_i\),使得对于两棵树的所有顶点\(x\),满足\(|x\)的子树的权值和\(|=1\) \(n\leq 1 ...

  6. bzoj 3674: 可持久化并查集加强版 (启发式合并+主席树)

    Description Description:自从zkysb出了可持久化并查集后……hzwer:乱写能AC,暴力踩标程KuribohG:我不路径压缩就过了!ndsf:暴力就可以轻松虐!zky:…… ...

  7. HNOI2019总结

    HNOI2019总结 Day 1 开场看三道题,T1是个计算几何,T2是个操作树加\(border\),T3题意有点复杂.想T1想了半个多小时,发现那个钝角不是很会处理,但是40分暴力应该还是可以写, ...

  8. 【比赛】NOIP2018 旅行

    发现 \(m\) 只有两种取值,于是可做了 树的直接贪心 图的枚举环上的边去掉,然后做树的贪心,搜的时候剪一下枝吧 写得有点乱 #include<bits/stdc++.h> #defin ...

  9. 【BZOJ4316】小C的独立集(动态规划)

    [BZOJ4316]小C的独立集(动态规划) 题面 BZOJ 题解 考虑树的独立集求法 设\(f[i][0/1]\)表示\(i\)这个点一定不选,以及\(i\)这个点无所谓的最大值 转移\(f[u][ ...

  10. ⌈洛谷1312⌋⌈NOIP提高组2011⌋Mayan游戏【搜索】

    感想 真的,感觉这道题目好坑爹,我这个蒟蒻调了好几个世纪才调出来. 重构代码千万遍,依旧只有-1输出. 正解 非常明显的一道搜索题目. 每一次记录上一级的状态,这样实现比较不容易出错. 然后考虑剪枝: ...