内容简介
本书从实践出发讲解Go语言的进阶知识。本书共6章,第1章简单回顾Go语言的发展历史;第2章和第3章系统地介绍CGO编程和Go汇编语言的用法;第4章对RPC和Protobuf技术进行深入介绍,并讲述如何打造一个自己的RPC系统;第5章介绍工业级环境的Web系统的设计和相关技术;第6章介绍Go语言在分布式领域的一些编程技术。书中还涉及CGO和汇编方面的知识,其中CGO能够帮助读者继承的软件遗产,而在深入学习Go运行时,汇编对于理解各种语法设计的底层实现是必不可少的知识。此外,本书还包含一些紧跟潮流的内容,介绍开源界流行的gRPC及其相关应用,讲述Go Web框架中的基本实现原理和大型Web项目中的技术要点,引导读者对Go语言进行更深入的应用。 本书适合对Go语言的应用已经有一些心得,并希望能够深入理解底层实现原理或者是希望能够在Web开发方面结合Go语言来实现进阶学习的技术人员学习和参考。
目录
目 录
第 1章 语言基础 1
1.1 Go语言创世纪 1
1.1.1 来自贝尔实验室特有基因 3
1.1.2 你好,世界 4
1.2 “Hello, World”的革命 5
1.2.1 B语言——Ken Thompson, 1969 5
1.2.2 C语言——Dennis Ritchie,1972—1989 5
1.2.3 Newsqueak——Rob Pike, 1989 7
1.2.4 Alef——Phil Winterbottom, 1993 9
1.2.5 Limbo——Sean Dorward, Phil Winterbottom, Rob Pike, 1995 10
1.2.6 Go语言——2007—2009 11
1.2.7 你好,世界!——V2.0 13
1.3 数组、字符串和切片 13
1.3.1 数组 14
1.3.2 字符串 17
1.3.3 切片 21
1.4 函数、方法和接口 27
1.4.1 函数 27
1.4.2 方法 31
1.4.3 接口 35
1.5 面向并发的内存模型 39
1.5.1 Goroutine和系统线程 40
1.5.2 原子操作 40
1.5.3 顺序一致性内存模型 44
1.5.4 初始化顺序 45
1.5.5 Goroutine的创建 46
1.5.6 基于通道的通信 46
1.5.7 不靠谱的同步 48
1.6 常见的并发模式 49
1.6.1 并发版本的“Hello, World” 50
1.6.2 生产者/消费者模型 52
1.6.3 发布/订阅模型 53
1.6.4 控制并发数 56
1.6.5 赢者为王 57
1.6.6 素数筛 58
1.6.7 并发的安全退出 59
1.6.8 context包 62
1.7 错误和异常 64
1.7.1 错误处理策略 65
1.7.2 获取错误的上下文 67
1.7.3 错误的错误返回 69
1.7.4 剖析异常 70
1.8 补充说明 73
第 2章 CGO编程 74
2.1 快速入门 74
2.1.1 CGO程序 74
2.1.2 基于C标准库函数输出字符串 75
2.1.3 使用自己的C函数 75
2.1.4 C代码的模块化 76
2.1.5 用Go重新实现C函数 77
2.1.6 面向C接口的Go编程 78
2.2 CGO基础 79
2.2.1 import "C"语句 79
2.2.2 #cgo语句 81
2.2.3 build标志条件编译 82
2.3 类型转换 83
2.3.1 数值类型 83
2.3.2 Go字符串和切片 85
2.3.3 结构体、联合和枚举类型 86
2.3.4 数组、字符串和切片 89
2.3.5 指针间的转换 91
2.3.6 数值和指针的转换 92
2.3.7 切片间的转换 93
2.4 函数调用 94
2.4.1 Go调用C函数 94
2.4.2 C函数的返回值 94
2.4.3 void函数的返回值 95
2.4.4 C调用Go导出函数 96
2.5 内部机制 97
2.5.1 CGO生成的中间文件 97
2.5.2 Go调用C函数 98
2.5.3 C调用Go函数 101
2.6 实战:封装qsort 103
2.6.1 认识qsort()函数 103
2.6.2 将qsort()函数从Go包导出 104
2.6.3 改进:闭包函数作为比较函数 106
2.6.4 改进:消除用户对unsafe包的依赖 108
2.7 CGO内存模型 110
2.7.1 Go访问C内存 110
2.7.2 C临时访问传入的Go内存 111
2.7.3 C长期持有Go指针对象 113
2.7.4 导出C函数不能返回Go内存 115
2.8 C++类包装 117
2.8.1 C++类到Go语言对象 117
2.8.2 Go语言对象到C++类 121
2.8.3 解放C++的this指针 125
2.9 静态库和动态库 126
2.9.1 使用C静态库 126
2.9.2 使用C动态库 128
2.9.3 导出C静态库 129
2.9.4 导出C动态库 131
2.9.5 导出非main包的函数 131
2.10 编译和链接参数 133
2.10.1 编译参数:CFLAGS/CPPFLAGS/CXXFLAGS 133
2.10.2 链接参数:LDFLAGS 133
2.10.3 pkg-config 133
2.10.4 go get链 134
2.10.5 多个非main包中导出C函数 135
2.11 补充说明 135