新書推薦:
《
云冈:人和石窟的1500年
》
售價:HK$
72.8
《
淡水鱼类营养生理与饲料
》
售價:HK$
333.8
《
人体结构绘画重点
》
售價:HK$
143.4
《
中国妖怪故事(全集·增订版)
》
售價:HK$
221.8
《
于胥斯原 乡族、风水与地方记忆
》
售價:HK$
177.0
《
以经治国与汉代社会
》
售價:HK$
98.6
《
我真正想要什么?:智慧瑜伽答问/正念系列
》
售價:HK$
58.2
《
元朝理财记 从成吉思汗的崛起到元朝的衰亡
》
售價:HK$
98.6
|
內容簡介: |
本书由《C程序设计语言》的作者Kernighan和谷歌公司Go团队主管AlanDonovan联袂撰写,是学习Go语言程序设计指南。本书共13章,主要内容包括:Go的基础知识、基本结构、基本数据类型、复合数据类型、函数、方法、接口、goroutine、通道、共享变量的并发性、包、go工具、测试、反射等。本书适合作为计算机相关专业的教材,也可供Go语言爱好者阅读。
|
關於作者: |
Alan Donovan 是谷歌公司基础架构部的主管工程师,专长是软件开发工具。自2012年,他一直工作的Got团队,设计用于静态分析的库和工具。他是oracle、godoc analysis、eg和gorename的作者。
Brianv Kernighan是《C程序设计语言》的作者之一,他与C语言的发明人Dennis Ritchie共同合作了这本书,K&R就是两人名字的缩写。他是一位加拿大计算机科学家,在贝尔实验室,他与Unix的创造者Ken Thompson以及Dennis Ritchie一起工作,同时它也是开发Unix的主要贡献者。他是 AWK 和 AMPL 编程语言的作者之一,AWK中的K说的就是Kernighan。Brian Kernighan现在是普林斯顿大学计算机学院的教授,同时,他也是本科学部的代表。
|
目錄:
|
目录
The Go Programming Language
出版者的话
译者序
前言
第1章 入门1
1.1 hello,world1
1.2 命令行参数3
1.3 找出重复行6
1.4 GIF动画10
1.5 获取一个URL12
1.6 并发获取多个URL13
1.7 一个Web服务器14
1.8 其他内容17
第2章 程序结构20
2.1 名称20
2.2 声明21
2.3 变量22
2.3.1 短变量声明22
2.3.2 指针23
2.3.3 new函数25
2.3.4 变量的生命周期26
2.4 赋值27
2.4.1 多重赋值27
2.4.2 可赋值性28
2.5 类型声明29
2.6 包和文件30
2.6.1 导入31
2.6.2 包初始化33
2.7 作用域34
第3章 基本数据38
3.1 整数38
3.2 浮点数42
3.3 复数45
3.4 布尔值47
3.5 字符串47
3.5.1 字符串字面量49
3.5.2 Unicode49
3.5.3 UTF-850
3.5.4 字符串和字节slice53
3.5.5 字符串和数字的相互转换56
3.6 常量56
3.6.1 常量生成器iota57
3.6.2 无类型常量59
第4章 复合数据类型61
4.1 数组61
4.2 slice63
4.2.1 append函数66
4.2.2 slice就地修改69
4.3 map71
4.4 结构体76
4.4.1 结构体字面量78
4.4.2 结构体比较80
4.4.3 结构体嵌套和匿名成员80
4.5 JSON82
4.6 文本和HTML模板87
第5章 函数92
5.1 函数声明92
5.2 递归93
5.3 多返回值96
5.4 错误98
5.4.1 错误处理策略99
5.4.2 文件结束标识101
5.5 函数变量102
5.6 匿名函数104
5.7 变长函数110
5.8 延迟函数调用111
5.9 宕机115
5.10 恢复118
第6章 方法120
6.1 方法声明120
6.2 指针接收者的方法122
6.3 通过结构体内嵌组成类型124
6.4 方法变量与表达式127
6.5 示例:位向量128
6.6 封装130
第7章 接口133
7.1 接口即约定133
7.2 接口类型135
7.3 实现接口136
7.4 使用flag.Value来解析参数139
7.5 接口值141
7.6 使用sort.Interface来排序144
7.7 http.Handler接口148
7.8 error接口152
7.9 示例:表达式求值器154
7.10 类型断言160
7.11 使用类型断言来识别错误161
7.12 通过接口类型断言来查询特性162
7.13 类型分支164
7.14 示例:基于标记的XML解析166
7.15 一些建议168
第8章 goroutine和通道170
8.1 goroutine170
8.2 示例:并发时钟服务器171
8.3 示例:并发回声服务器174
8.4 通道176
8.4.1 无缓冲通道177
8.4.2 管道178
8.4.3 单向通道类型180
8.4.4 缓冲通道181
8.5 并行循环183
8.6 示例:并发的Web爬虫187
8.7 使用select多路复用190
8.8 示例:并发目录遍历192
8.9 取消195
8.10 示例:聊天服务器198
第9章 使用共享变量实现并发201
9.1 竞态201
9.2 互斥锁:sync.Mutex205
9.3 读写互斥锁:sync.RWMutex208
9.4 内存同步208
9.5 延迟初始化:sync.Once210
9.6 竞态检测器212
9.7 示例:并发非阻塞缓存212
9.8 goroutine与线程218
9.8.1 可增长的栈219
9.8.2 goroutine调度219
9.8.3 GOMAXPROCS219
9.8.4 goroutine没有标识220
第10章 包和go工具221
10.1 引言221
10.2 导入路径221
10.3 包的声明222
10.4 导入声明223
10.5 空导入223
10.6 包及其命名225
10.7 go工具226
10.7.1 工作空间的组织227
10.7.2 包的下载228
10.7.3 包的构建229
10.7.4 包的文档化231
10.7.5 内部包232
10.7.6 包的查询233
第11章 测试235
11.1 go test工具235
11.2 Test函数236
11.2.1 随机测试239
11.2.2 测试命令240
11.2.3 白盒测试242
11.2.4 外部测试包245
11.2.5 编写有效测试246
11.2.6 避免脆弱的测试247
11.3 覆盖率248
11.4 Benchmark函数250
11.5 性能剖析252
11.6 Example函数254
第12章 反射256
12.1 为什么使用反射256
12.2 reflect.Type和reflect.Value257
12.3 Display:一个递归的值显示器259
12.4 示例:编码S表达式263
12.5 使用reflect.Value来设置值266
12.6 示例:解码S表达式268
12.7 访问结构体字段标签271
12.8 显示类型的方法273
12.9 注意事项274
第13章 低级编程276
13.1 unsafe.Sizeof、Alignof 和Offsetof276
13.2 unsafe.Pointer278
13.3 示例:深度相等280
13.4 使用cgo调用C代码282
13.5 关于安全的注意事项286
|
內容試閱:
|
前言The Go Programming LanguageGo是一种开源的程序设计语言,它意在使得人们能够方便地构建简单、可靠、高效的软件。(来自Go官网golang.org)Go在2007年9月形成构想,并于2009年11月发布,其发明人是Robert Griesemer、Rob Pike和Ken Thompson,这几位都任职于Google。该语言及其配套工具集使得编译和执行既富有表达力又高效,而且使得程序员能够轻松写出可靠、健壮的程序。
Go和C从表面上看起来相似,而且和C一样,它也是专业程序员使用的一种工具,兼有事半功倍之效。但是Go远不止是C的一种升级版本。基于多种其他语言,它取其精华,去其糟粕。它实现并发功能的设施是全新的、高效的,实现数据抽象和面向对象的途径是极其灵活的。它还实现了自动化的内存管理,或称为垃圾回收。
Go特别适用于构建基础设施类软件(如网络服务器),以及程序员使用的工具和系统等。但它的的确确是一种通用语言,而且在诸多领域(如图像处理、移动应用和机器学习)中都能发现它的身影。它在很多场合下用于替换无类型的脚本语言,这是由于它兼顾了表达力和安全性:Go程序通常比动态语言程序运行速度要快,由于意料之外的类型错误而导致崩溃的情形更是少得多。
Go是个开源项目,所以其编译器、库和工具的源代码是人人皆可免费取得的。来自全世界的社区都在积极地向这个项目贡献代码。Go的运行环境包括类UNIX系统Linux、FreeBSD、OpenBSD和Mac OS X,还有Plan 9和Microsoft Windows。只要在其中一个环境中写了一个程序,那么基本上不加修改它就可以运行在其他环境中。
本书旨在帮助读者立刻开始使用Go,以及熟练掌握这门语言,并充分地利用Go的语言特性和标准库来撰写清晰的、符合习惯用法的、高效的程序。
Go的起源和生物学物种一样,成功的语言会繁衍后代,这些后代语言会从它们的祖先那里汲取各种优点;有时候,语言间的混血会产生异常强大的力量;在一些罕见情况下,某个重大的语言特性也可能凭空出现而并无先例。通过考察语言间的影响,我们可以学得不少知识,比如语言为什么会变成这个样子,以及它适合用于哪些环境,等等。
下图展示了更早出现的程序设计语言对Go产生的最重要影响。
Go有时会称为类C语言或21世纪的C。从C中,Go继承了表达式语法、控制流语句、基本数据类型、按值调用的形参传递和指针,但比这些更重要的是,继承了C所强调的要点:程序要编译成高效的机器码,并自然地与所处的操作系统提供的抽象机制相配合。
可是,Go的家谱中还有其他祖先。产生主要影响的是由Niklaus Wirth设计的、以Pascal为发端的一个语言支流。Modula-2启发了包概念。Oberon消除了模块接口文件和模块实现文件之间的差异。Oberon-2影响了包、导入和声明的语法,并提供了方法声明的语法。
Go的另一支世系祖先它使得Go相对于当下的程序设计语言显得卓然不群,是在贝尔实验室开发的一系列名不见经传的研究用语言。这些语言都受到了通信顺序进程(Communicating Sequential Process,CSP)的启发,CSP由Tony Hoare于1978年在发表的关于并发性基础的开创性论文中提出。在CSP中,程序就是一组无共享状态进程的并行组合,进程间的通信和同步采用通道完成。不过,Hoare提出的CSP是一种形式语言,仅用于描述并发性的基本概念,并不是一种用来撰写可执行程序的程序设计语言。
Rob Pike等人开始动手做一些实验,尝试把CSP实现为真正的语言。第一种这样的语言称为Squeak(和鼠类沟通的语言),它是一种用于处理鼠标和键盘事件的语言,其中具有静态创建的通道。紧接着它的是Newsqueak,它具有类C的语句和表达式语法,以及类Pascal的类型记法。它是一种纯粹的函数式语言,具有垃圾回收功能,同样也以管理键盘、鼠标和窗口事件为目标。通道变成了一等值(first-class value),它可以动态创建并用变量存储。
Plan 9操作系统将这些思想都纳入一种称为Alef的语言中。Alef尝试将Newsqueak改造成一种可用的系统级程序设计语言,但垃圾回收功能的缺失使得它在处理并发性时捉襟见肘。
Go中的其他结构也会不时显示出某些并非来自祖先的基因。例如,iota多多少少有点APL的影子,而嵌套函数的词法作用域则来自Scheme(以及由之而来的大部分语言)。在Go语言中,也可以发现全新的变异。Go中新颖的slice不仅为动态数组提供了高效的随机访问功能,还允许旧式链表的复杂共享机制。另外,defer语句也是Go中新引入的。
Go项目所有的程序设计语言都反映了其发明者的程序设计哲理,其中相当大的一部分是对于此前语言已知缺点的应对措施。Go这个项目也诞生于挫败感,这种挫败感来源于Google的若干复杂性激增的软件系统。(而且这个问题绝非Google所独有的。)复杂性是以乘积方式增长的。Rob Pike如是说。为了修复某个问题,一点点地将系统的某个部分变得更加复杂,这不可避免地也给其他部分增加了复杂性。在不断要求增加系统功能、选项和配置,以及快速发布的压力之下,简单性往往被忽视了(尽管长期来看,简单性才是好软件的不二法门)。
要实现
|
|