Go程序设计语言(英文版)

Go程序设计语言(英文版) pdf epub mobi txt 电子书 下载 2025

[美] 艾伦A.A.多诺万 等 著
图书标签:
  • Go
  • 编程
  • 软件开发
  • 计算机科学
  • 英文
  • 技术
  • 编程语言
  • 算法
  • 数据结构
  • 并发编程
想要找书就要到 图书大百科
立刻按 ctrl+D收藏本页
你会得到大惊喜!!
出版社: 机械工业出版社
ISBN:9787111526285
版次:1
商品编码:11864836
品牌:机工出版
包装:平装
丛书名: 经典原版书库
开本:16开
出版时间:2016-01-01
用纸:胶版纸
页数:366

具体描述

编辑推荐

  继承K&R;精髓的Go语言编程圣经,《C程序设计语言》的作者Kernighan教授与谷歌Go开发团队核心成员Donovan联合编写。

  凝聚大师毕生造诣,融合Go开发团队智慧,经典与权*的碰撞,打造Go语言编程圣经。

  尽得《C程序设计语言》的精髓,简洁实用,字字珠玑,学习Go语言程序设计的权*指南。

内容简介

  Go语言是谷歌推出的一种全新的C语言风格的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性,提高编程效率,适合开发大型软件,有望成为主流的编程语言。本书由《C程序设计语言》的作者Kernighan和谷歌公司Go团队合作编写而成,是关于Go语言编程的著作。

目录

第1章 综述 1
1.1 Hello,World 1
1.2 命令行参数 4
1.3 查找重复行 8
1.4 GIF动画 13
1.5 获取一个URL 15
1.6 并发获取多个URL 17
1.7 实现一个Web服务器 19
1.8 杂项 23
第2章 程序结构 27
2.1 名字 27
2.2 声明 28
2.3 变量 30
2.4 赋值 36
2.5 类型声明 39
2.6 包和文件 41
2.7 作用域 45
第3章 基本数据类型 51
3.1 整数 51
3.2 浮点数 56
3.3 复数 61
3.4 布尔量 63
3.5 字符串 64
3.6 常量 75
第4章 复合类型 81
4.1 数组 81
4.2 切片 84
4.3 键值对 93
4.4 结构体 99
4.5 JSON 107
4.6 文本和HTML模板 113
第5章 函数 119
5.1 函数声明 119
5.2 递归 121
5.3 多返回值 124
5.4 错误 127
5.5 作为值的函数 132
5.6 匿名函数 135
5.7 变参函数 142
5.8 延后函数调用 143
5.9 崩溃 148
5.10 恢复 151
第6章 方法 155
6.1 方法声明 155
6.2 带有指针接收器的方法 158
6.3 包含嵌入结构体的复合类型 161
6.4 作为值和表达式的方法 164
6.5 示例:位向量类型 165
6.6 封装 168
第7章 接口 171
7.1 作为规约的接口 171
7.2 接口类型 174
7.3 接口约定的达成 175
7.4 使用flag.Value进行标志位分析 179
7.5 作为值的接口 181
7.6 使用sort.Interface进行排序 186
7.7 http.Handler接口 191
7.8 错误接口 196
7.9 示例:表达式评估器 197
7.10 类型断言 205
7.11 使用类型断言分辨错误 206
7.12 使用接口类型断言查询行为 208
7.13 按类型的程序分支 210
7.14 示例:基于标记符号的XML解码 213
7.15 几句建议 216
第8章 goroutine和信道 217
8.1 goroutine 217
8.2 示例:并发时钟服务器 219
8.3 示例:并发回声服务器 222
8.4 信道 225
8.5 并行循环 234
8.6 示例:并发Web爬虫 239
8.7 使用select实现多工 244
8.8 示例:并发目录遍历 247
8.9 取消执行 251
8.10 示例:聊天服务器 253
第9章 使用共享变量实现并发 257
9.1 竞险 257
9.2 互斥量:sync.Mutex 262
9.3 读写互斥量:sync.RWMutex 266
9.4 内存同步 267
9.5 缓式初始化:sync.Once 268
9.6 竞险检测器 271
9.7 示例:并发无阻塞式高速缓存 272
9.8 goroutine和线程 280
第10章 包和go工具 283
10.1 概述 283
10.2 导入路径 284
10.3 包声明 285
10.4 导入声明 285
10.5 空导入 286
10.6 包和命名 289
10.7 go工具 290
第11章 测试 301
11.1 go test工具 302
11.2 测试函数 302
11.3 覆盖率 318
11.4 性能基准函数 321
11.5 性能剖析 323
11.6 示例函数 326
第12章 反射 329
12.1 为什么会引入反射概念 329
12.2 reflect.Type和reflect.Value 330
12.3 递归值输出Display 333
12.4 示例:对S-表达式编码 338
12.5 使用reflect.Value给变量设置值 341
12.6 示例:对S-表达式解码 344
12.7 访问结构体域标签 348
12.8 列出类型的方法 351
12.9 几句忠告 352
第13章 低阶程序设计 353
13.1 unsafe.Sizeof、Alignof和Offsetof 354
13.2 unsafe.Pointer 356
13.3 示例:深等价 358
13.4 使用cgo调用C代码 361
13.5 再来几句忠告 366
1. Tutoria 1
1.1. Hello, World1
1.2.?Command?L?ineArguments?4
1.3.?FindingDup?lic?ateLines?8
1.4.?Animated?GIFs?13
1.5.?FetchingaURL?15
1.6.?FetchingURLs?Con?cur?rently17
1.7.?AWe?bServer?19
1.8.?Loose?End?s232.?
2.?ProgramStr?ucture27
2.1.?Names?27
2.2.?Declarat?ions?28
2.3.?Var?iables?30
2.4.?Assig?nments?36
2.5.?Typ?eDecl?arat?ions?39
2.6.?Packages?andFiles?41
2.7.?Scope?45
3.?Basic?Data?Typ?es51
3.1.?Int?egers?51
3.2.?Float?ing?Point?Numbers?56
3.3.?Complex?Numbers?61
3.4.?Boole?ans63
3.5.?Str?ings64
3.6.?Con?stants75
4.?Com?positeTyp?es81
4.1.?Arrays?81
4.2.?Slices?84
4.3.?Maps?93
4.4.?Str?ucts99
4.5.?JSON107
4.6.?Text?andHTMLTempl?ates113
5.?Func?tions?119
5.1.?FunctionDeclarat?ions?119
5.2.?Rec?ursio 121
5.3..MultipleReturn Values.124
5.4..Errors 127
5.5..FunctionValues.132
5.6..Anonymous Functions.135
5.7..Variadic.Functions.142
5.8..Deferred.FunctionCalls 143
5.9..Panic.148
5.10..Recover 151
6..Methods 155
6.1..Method.Declarations.155
6.2..MethodswithaPointerReceiver 158
6.3..ComposingTypesby.Struct.Embedding 161
6.4..Method.Values.andExpressions.164
6.5..Example:.Bit.Vector.Type 165
6.6..Encapsulation 168
7..Interfaces 171
7.1..Interfaces.as.Contracts 171
7.2..Interface.Types 174
7.3..Interface.Satisfaction 175
7.4..ParsingFlags.withflag.Value 179
7.5..Interface.Values.181
7.6..Sortingwithsort.Interface 186
7.7..The http.Handler Interface.191
7.8..The error Interface.196
7.9..Example:.ExpressionEvaluator 197
7.10..Type Assertions.205
7.11..DiscriminatingErrorswith.TypeAssertions.206
7.12..QueryingBehaviorswith.Interface.TypeAssertions.208
7.13..Type Switches 210
7.14..Example:.Token-Based.XML.Decoding 213
7.15..AFew Words.ofAdvice.216
8..Goroutines.and.Channels.217
8.1..Goroutines 217
8.2..Example:.ConcurrentClockServer.219
8.3..Example:.ConcurrentEcho Server.222
8.4..Channels 225
8.5..Looping.inParallel 234
8.6..Example:.ConcurrentWeb.Crawler 239
8.7..Multiplexingwithselect 244
8.8..Example:.ConcurrentDirectoryTraversal 247
8.9..Cancellation 251
8.10..Example:.ChatSer.ver.253
9..Concurrency.withShared.Vari.ables 257
9.1..Race.Con.dit.ion.s 257
9.2..Mut.ual.Exc.lusion:sync.Mutex 262
9.3..Read/Write.Mut.exes:sync.RWMutex 266
9.4..Memor.ySy.nchro.nizat.ion 267
9.5..Lazy.Initializat.ion:sync.Once 268
9.6..TheRace.Detec.tor.271
9.7..Example:.Con.cur.rentNon-Blo.cking.Cache.272
9.8..Goroutinesand.Threads.280
10..Pack.ages and.the.GoTool 283
10.1..Int.roduc.tion 283
10.2..Imp.ort.Pat.hs 284
10.3..ThePackageDeclarat.ion 285
10.4..Imp.ort.Declarat.ions.285
10.5..Blank.Imp.orts 286
10.6..Packages.andNaming 289
10.7..TheGoTool 290
11..Testing.301
11.1..The go.test To.ol 302
11.2. Test Func.tions.302
11.3..Cov.erage 318
11.4. Benchmark Func.tions.321
11.5..Pro.ling 323
11.6. Example Func.tions.326
12..Re.ecti.on 329
12.1..Why.Re.ec.tion? 329
12.2. reflect.Type and reflect.Value 330
12.3. Display,aRec.ursiveValue.Print.er 333
12.4..Example:.Enco.dingS-E.xpressions.338
12.5..Setting.Var.iables.wit.hreflect.Value 341
12.6..Example:.DecodingS-E.xpressions.344
12.7..AccessingStr.uct.Field.Tags.348
12.8..Displaying.the.Met.hodsofaTyp.e 351
12.9..AWo.rdofCaution.352
13..Low-L.evel.Pro.gramming 353
13.1. unsafe.Sizeof, Alignof,and Offsetof 354
13.2. unsafe.Pointer 356
13.3..Example:.DeepEquivalence.358
13.4..Cal.lingCCodewit.hcgo 361
13.5..Another.WordofCaution.366

前言/序言

  “Go是一种开放源代码的程序设计语言,它意在使得人们能够方便地构建简单、可靠、高效的软件。”(来自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影响了包、导入和声明语法。Object Oberon则提供了方法声明语法。
  另一支Go的世系祖先,也是使得Go相对于当下的程序设计显得卓然不群者,是一族名不见经传的、在贝尔实验室开发的研究用语言。这些语言都受到了Tony Hoare于1978年发表的关于并发性基础的开创性论文所提出的通信顺序进程(Communicating Sequential Process,CSP)的启发。在CSP中,程序就是一组无共享状态进程的并行组合,进程间的通信和同步采用信道完成。不过,Hoare提出的CSP是一种形式语言,仅用以描述并发性的基本概念,并不是一种用来撰写可执行程序的程序设计语言。
  Rob Pike等人开始动手做一些实验,尝试把CSP实现为真正的语言。第一种这样的语言称为Squeak(“和鼠类沟通的语言”),它是一种用以处理鼠标和键盘事件的语言。紧接着它的是Newsqueak,它带来的是类C的语句和表达式语法,以及类Pascal的类型记法。它是一种纯粹的函数式语言,带有垃圾收集,同样也以管理键盘、鼠标和窗口事件为目标。信道成了一等值(first-class value),它可以动态创建并采用变量存储。
  Plan 9操作系统将这些思想都纳入了一种称为Alef的语言。Alef尝试将Newsqueak改造成一种可用的系统级程序设计语言,但垃圾收集的缺失使得它在处理并发性时太过痛苦了。
  Go中的其他结构也会在这里或那里显示出某些并非来自祖先的基因。例如,iota多多少少有点APL的影子,而嵌套函数的词法作用域则来自Scheme(以及由之而来的大部分语言)。在Go语言中,也可以发现全新的变异。Go的创新性的切片为动态数组提供了高效的随机访问的同时,也允许旧式链表的复杂共享机制。还有,defer语句也是Go中新引入的。
  Go项目所有的程序设计语言都反映了其发明者的程序设计哲学,这其中往往有相当大的一部分是对于此前的语言已知缺点的应对措施。Go这个项目也是诞生于挫败感之中的,这种挫败感来源于Google的若干遭遇了复杂性爆炸性增长的软件系统。(而这个问题绝非Google所独有的。)“复杂性是以乘积方式增长的。”Rob Pike如是说。为了修复某个问题,一点点地将系统的某个部分变得更加复杂,这不可避免地也给其他部分增加了复杂性。在不断要求增加系统功能和选项以及配置,还要快速发布的压力之下,简单性往往被忽视了—尽管长期来看,简单性才是好软件的不二法门。
  要实现简单性,就要求在项目的一开始就将思想浓缩至本质,并在项目的整个生命期多保持一些自律,认识到哪些变化是好的,哪些是坏的或致命的。只要投入足够的努力,好的变化就既可以实现目的,又能够不损害软件设计上的Fred Brooks所谓的“概念完整性”。坏的变化就做不到这一点,而致命的变化则会牺牲“简单性”而去换得其浅薄的兄弟概念—“方便性”。但是,只有通过设计上的简单性,系统才能在增长过程中保持稳定、安全和自洽。
  Go项目不仅仅包括语言本身、它的工具和标准库,还有决不能忽视的一点,就是它保持极端简单性的行为文化。在高级语言中,Go出现得较晚,因而有一定后发优势,它的基础部分实现得不错:有垃圾收集、包系统、一等函数、词法作用域、系统调用接口,还有不可变的、默认用UTF-8编码的字符串。但相对来说,它的语言特性不多,而且不太会增加新特性了。比如说,它没有隐式数值类型强制转换,没有构造或析构函数,没有运算符重载,没有形参默认值,没有继承,没有泛型,没有异常,没有宏,没有函数注记,没有线程局部存储。这门语言成熟而稳定,并且保证兼容更早版本:在旧版本的Go语言中写的程序,可以在新版本的编译器和标准库下编译和运行。
  Go的类型系统足可以使程序员避免在动态语言中会无意犯下的绝大多数错误,但相对而言,它在带类型的语言中又算是类型系统比较简单的。其实现手法有时候会导致类型框架林立却彼此孤立的“无类型”程序设计风格,并且Go程序员不会在类型方面走到C++或Haskell程序员的那一步—重度地表达类型安全性作为语言具备类型基础的证据。但在实际工作中,Go却能为程序员提供具备相当强类型的系统才能实现的安全性和运行时性能,而不让程序员承担这种系统的复杂性。
  Go提倡充分利用当代计算机系统设计,尤其强调局部性的重要。其内建数据类型和大多数库数据结构都经过仔细设计,力求以自然方式工作,而不要求显式的初始化或隐式的构造函数。这么一来,隐藏在代码中的内存分配和内存写入就大大减少了。Go中的聚合类型(结构体和数组)都是以直接方式持有其元素,需要更少的存储以及比使用间接域的语言还少的分配动作和间接指针。由于现代计算机都是并行工作的,正如前面提到的那样,Go有着基于CSP的并行特性。Go还提供了变长栈来运行其轻量级线程,或称为goroutine。这个栈初始化时非常小,所以创建一个goroutine的成本极低,创建100万个也完全可以接受。
  Go标准库常常被称作“语言自带电池”,它提供了清晰的构件,以及用于I/O、文本处理、图像、加解密、网络、分布式应用的API,而且对许多标准文件格式和协议都提供了支持。Go的库和工具充分地尊重惯例,减少了配置和解释的需要,从而简化了程序逻辑,提高了多种多样的Go程序之间的相似性,使得它更容易学习和掌握。采用go工具构建的项目,仅使用文件和标识符的名字(在极少情况下使用特殊注释),就可以推断出一个项目使用的所有库、可执行文件、测试、性能基准、示例、平台相关变体,以及文档。Go的源代码中就包含了构建的规格说明。
  全书组织我们假定你用过一两种其他语言编过程序,可能是像C、C++或Java那样的编译型语言,也可能是像Python、Ruby或JavaScript那样的解释型语言,所以我们不会像对一个没有任何基础的初学者那样事无巨细地讲述所有事。表面上的语法大体雷同,变量、常量、表达式、控制流和函数也一样。
  第1章是Go的基础结构的综述,通过十几个完成日常任务(包括读写文件、格式化文本、创建图像,以及在Internet客户端和服务器之间通信)的程序来介绍这门语言。
  第2章讲述Go程序的组成元素—声明、变量、新类型、包和文件,以及作用域。第3章讨论数值、布尔量、字符串、常量,还解释如何处理Unicode。第4章描述组合类型,即使用简单类型构造的类型,形式有数组、键值对、结构体,还有切片这种Go中动态表的实现。第5章的内容是函数,另外还讨论了错误处理、崩溃和恢复,以及defer语句。
  可以看出,第1章到第5章是基础性的,其内容是任何命令式语言都有的。Go的语法和风格可能与其他语言有所不同,但大多数程序员都能很快掌握。余下的章节所关注的则是Go语言中与惯常做法有一定区别的内容,包括方法、接口、并发、包、测试和反射。
  Go以一种不同寻常的方式来诠释面向对象程序设计。它没有类继承,甚至没有类。较复杂的对象行为是通过较简单的对象组合而非继承完成的。方法可以关联到任何用户自定义的类型,而不一定是结构体。具体类型和抽象类型(即接口)之间的关系是隐式的,所以一个具体类型可能会满足该类型设计者没有意识到其存在的接口。方法在第6章讲述,接口在第7章讲述。
  第8章内容是Go的并发性处理途径,它基于CSP思想,采用goroutine和信道实现。第9章则讨论并发性中较传统的基于共享变量的一些方面的话题。
  第10章讨论包,也就是组织库的机制。本章也说明如何高效地利用go工具,仅仅这个工具,就提供了编译、测试、性能基准测定、程序格式化、文档,以及完成许多其他任务的功能。
  第11章讨论测试,在这里Go采取了显著的轻量级途径,避免了重重抽象的框架,转而使用简单的库和工具。测试库提供了一个基础,在其之上如有必要就可以构建更复杂的抽象了。
  第12章讨论反射,即程序在执行期间考察自身表示的能力。反射是一种强大的工具,不过得小心使用它,本章通过演示如何用它来实现某些重要的Go库,解释了如何找到适当的平衡。第13章解释低阶程序设计的细节,运用unsafe包来绕过Go的类型系统,以及什么时候这样做是合适的。
  每章都配以一定数量的练习,你可以用来测试对Go的理解,或是探索对书中示例的扩展和变形。
  除了最简单的那些以外,所有书中的示例代码都可以从位于gopl.io的公开Git仓库下载。每个示例由其包的导入路径识别,从而能够方便地使用go get命令获取、构建和安装。你需要选取一个目录作为你的Go工作空间,并将GOPATH环境变量指向之。在必要时,go工具会创建该目录。例如:
  欲运行这些例子,你至少需要使用1.5版本的Go语言。
  如果你的计算机上的go工具太旧或是缺失,请按https://golang.org/doc/install的指令操作。
  更多信息来源关于Go的更多信息,最好的来源就是Go的官方网站:https://golang.org,它上面列出了文档供读者访问,包括Go程序设计语言规范、标准包,诸如此类。它上面还列出语言综述,指导如何撰写Go程序,以及如何撰写好的Go程序,还有范围广泛的在线文本和视频资源,这些都是对本书的有价值的补充。位于blog.golang.org的Go博客发表的是关于Go的最好文章,以及该语言当下状态、未来计划、会议报告,还有范围广泛的Go相关话题的深度解读。
  Go官网在线访问的一个最有用的方面(这也是纸质书的一个令人遗憾的限制),就是它提供了从描述Go程序的网页上直接运行Go程序的能力。这种功能由位于play.golang.org的Go训练场提供,也有嵌入其他页面的,比如位于golang.org的首页,或是由godoc工具提供的文档页面。
  训练场为执行简单的实验,撰写短小的程序来检验自己对语法、语义和库包的理解提供了方便,它在很多方面取代了其他语言中的读取–求值–输出循环(Read-Eval-Print Loop,REPL)。它的永久URL对于共享使用Go写成的小段代码、报告缺陷或提出建议都是很有用的。
  在训练场的基础之上,位于tour.golang.org的Go综述就是一系列的小型交互式课程,内容是Go语言的基础思想和结构,是整门语言的有序攻略。
  训练场和综述的主要缺点在于它只允许导入标准库,还有很多库特性(比如网络库)都出于可操作性或安全原因加以限制了。而要编译和运行每个程序,都要求Internet连接。所以,欲进行更详尽的实验,需要在本机上运行Go程序。幸运的是,下载过程相当直截了当,从golang.org获取Go的分发程序并开始撰写和运行你自己的Go程序,用不了几分钟。
  由于Go是个开源项目,你可以从https://golang.org/pkg上在线读取标准库中的任何类型或函数的代码,每个供下载的分发都同样包含这些代码。请使用这些代码来弄明白某些程序的运行原理、回答关于程序细节的问题,也可以用它们来学一学专家是如何写出一流的Go代码的。
  致谢来自Go团队的核心成员Rob Pike和Russ Cox仔细通读了初稿数次,他们对于从词句的斟酌到整体结构和组织的建议都极富价值。在准备本书的日语版时,柴田芳树所做的贡献大大超过了他负担的义务,他的火眼金睛发现了大量英语文本中的不一致性,以及代码中的错误。我们向Brian Goetz、Corey Kosak、Arnold Robbins、Josh Bleecher Snyder以及Peter Weinberger对全书初稿所进行的彻底审查和批评建议深表敬意。
  我们感激Sameer Ajmani、Ittai Balaban、David Crawshaw、Billy Donohue、Jonathan Feinberg、Andrew Gerrand、Robert Griesemer、John Linderman、Minux Ma、Bryan Mills、Bala Natarajan、Cosmos Nicolaou、Paul Staniforth、Nigel Tao以及Howard Trickey提供的诸多有用建议。 我们也感谢David Brailsford和Raph Levien的排版建议。
  我们的Addison-Wesley编辑Greg Doench最初催生了本书,而且一直不断地给予帮助。Addison-Wesley的制作团队—John Fuller、Dayna Isley、Julie Nahil、Chuti Prasertsith以及Barbara Wood—非常杰出,作者得到了一流的支持。
  Alan Donovan想要感谢Google的Sameer Ajmani、Chris Demetriou、Walt Drummond以及Reid Tatge让他有时间来写作这本书,还有Stephen Donovan的建议和及时的鼓励。最重要的是他的妻子Leila Kazemi,她为写作项目提供了毫不犹豫的热情和毫不动摇的支持,即使写作造成了很多家庭生活的分心和缺席。
  Brian Kernighan对他的朋友和同事深表谢意,他们对Kernighan花费了很长时间才达成对语言的理解表示了耐心和理解。尤其是他的妻子Meg,她为Kernighan的写作以及太多的其他事务提供了不间断的支持。
  纽约2015年10月

《Go程序设计语言》:拥抱效率与简洁,开启云原生时代的高效开发之旅 在飞速发展的技术浪潮中,软件开发的效率、可维护性和并发处理能力已成为衡量一个项目成功与否的关键指标。《Go程序设计语言》正是为了应对这些挑战而诞生的,它以其简洁的语法、高效的并发模型和卓越的性能,迅速成为构建现代、可扩展系统的首选语言。这本书并非仅仅是语言特性的罗列,而是深入探讨了Go语言的设计哲学,引导读者理解其“简洁即是强大”的核心理念,并将其巧妙应用于实际开发场景中。 本书旨在为开发者提供一个全面而深入的学习路径,从Go语言的基础知识出发,逐步攀升至高级主题和实际应用。它不仅适合初学者快速掌握一门强大的新语言,也同样能够为经验丰富的开发者带来新的启发和视角,帮助他们构建更健壮、更高效的软件。 第一部分:Go语言的基石——简洁之美 我们从Go语言最核心的设计原则——“简洁”开始。Go语言的设计者们深谙“复杂性是软件开发中的敌人”这一道理,因此,Go的语法精炼,冗余极少,易于学习和理解。本书将带领你逐一探索这些基础要素: 变量、类型与值: 深入理解Go语言强类型系统的优势,以及如何有效地声明和使用变量。我们不仅介绍基本数据类型(整型、浮点型、布尔型、字符串),还将探讨复合类型(数组、切片、映射、结构体),并强调Go的零值概念,让你的代码更安全、更可预测。 控制流: `if-else`、`for`循环、`switch`语句,Go的控制流语句简洁明了,没有C语言中那些容易出错的陷阱。我们将学习如何利用Go的`range`关键字优雅地遍历集合,以及`defer`语句在清理资源时的强大作用,例如确保文件关闭或锁的释放,即使发生错误。 函数与作用域: 函数是Go程序的基本构建块。本书将详细讲解函数定义、参数传递(值传递和引用传递)、返回值(包括多返回值)以及闭包的概念。理解作用域对于编写清晰、模块化的代码至关重要,我们将深入探讨局部变量、全局变量以及函数内联的优化。 指针: 指针是内存地址的引用,理解指针对于高效地操作数据和理解Go的底层机制至关重要。本书将清晰地解释指针的声明、解引用和指针运算,并特别强调Go中指针的安全性,避免了C/C++中常见的指针越界等问题。 包与导入: Go的包管理机制是其高效开发的重要保障。我们将学习如何组织代码到不同的包中,如何导出(public)和隐藏(private)标识符,以及如何使用`import`关键字导入外部包,构建清晰的项目结构。 第二部分:并发的利器——协程与通道 并发编程是现代软件开发的另一大挑战。Go语言以其独创的协程(Goroutines)和通道(Channels)机制,将并发编程的复杂性降到了前所未有的低点。本书将用大量篇幅深入剖析这一Go语言的“杀手级特性”: 协程(Goroutines): Go的协程是轻量级的用户态线程,创建成本极低,可以同时运行成千上万个。我们将学习如何使用`go`关键字轻松启动协程,并理解协程与操作系统线程的区别,从而编写出高性能的并发程序。 通道(Channels): 通道是协程之间通信和同步的主要方式。本书将详尽介绍通道的创建、发送和接收操作,以及无缓冲通道和有缓冲通道的区别和适用场景。我们将学习如何利用通道避免数据竞争,实现安全的并发数据共享。 选择(Select): `select`语句是Go处理多个通道操作的强大工具,它允许协程同时等待多个通信操作,并选择其中一个就绪的操作进行执行。我们将学习`select`的用法,以及如何使用`default`子句实现非阻塞的通道操作。 同步原语: 除了通道,Go的标准库还提供了`sync`包,包含了常用的同步原语,如互斥锁(`sync.Mutex`)、读写锁(`sync.RWMutex`)和等待组(`sync.WaitGroup`)。本书将讲解这些原语的使用场景和最佳实践,帮助开发者在特定情况下实现更精细化的并发控制。 并发模式: 我们将深入探讨一些经典的并发设计模式,例如生产者-消费者模式、工作池模式、流水线模式等,并展示如何使用Go的并发原语来实现它们。理解这些模式将极大地提升你构建高并发系统的能力。 第三部分:实战与进阶——构建可靠的Go应用 理论知识的掌握需要结合实际应用才能转化为真正的能力。本书将引导读者将所学知识付诸实践,并探索Go语言在构建实际应用中的强大威力: 错误处理: Go语言独特的错误处理机制——将错误作为返回值,鼓励开发者显式地处理错误。本书将详细讲解`error`接口的用法,以及如何通过`if err != nil`模式编写健壮的代码。我们将探讨错误包装、自定义错误类型等高级错误处理技术。 接口与多态: Go的接口是一种强大的抽象机制,它定义了一组方法签名,而无需关心具体的实现类型。本书将深入讲解接口的定义、实现以及接口组合,帮助你编写高度解耦、易于扩展的代码。理解接口是掌握Go语言多态性的关键。 结构体与方法: 结构体是组合不同类型数据的有效方式。我们将学习如何定义结构体,以及如何为结构体关联方法,从而实现面向对象的编程范式(尽管Go并非纯粹的面向对象语言)。 反射(Reflection): 反射允许程序在运行时检查和修改其自身的结构。本书将介绍`reflect`包的基本用法,以及它在序列化、反序列化和元编程中的应用。同时,我们也会强调过度使用反射可能带来的性能和可读性问题。 测试与性能优化: 编写测试是保证软件质量的重要环节。我们将学习Go的`testing`包,如何编写单元测试、基准测试,以及如何利用Go的工具进行性能分析和优化。 网络编程: Go语言在网络编程方面拥有天然的优势。本书将讲解`net/http`包,如何构建Web服务器、客户端,以及如何使用`net`包进行TCP/UDP通信。 标准库的宝藏: Go语言拥有一个极其丰富和强大的标准库。本书将介绍一些常用的标准库包,例如`fmt`(格式化输入输出)、`io`(输入输出)、`os`(操作系统接口)、`strings`(字符串操作)、`time`(时间处理)等,并展示它们在实际开发中的应用。 构建工具与项目管理: 掌握Go的构建工具`go build`、`go run`、`go get`以及模块化管理`go modules`是高效开发的基础。本书将为你介绍这些工具,帮助你更好地管理和构建你的Go项目。 实战案例解析: 为了让读者更好地理解Go语言的强大之处,本书将穿插多个精心设计的实战案例,涵盖从简单的命令行工具到复杂的Web服务,让你在实践中巩固所学,体验Go语言的魅力。 《Go程序设计语言》 不仅仅是一本技术书籍,它更是一份邀请,邀请你加入到Go语言的开发社区,体验一种更高效、更简洁、更富有活力的编程方式。无论你是初入编程的菜鸟,还是经验丰富的架构师,这本书都将为你打开一扇通往现代化软件开发新世界的大门,让你在云原生时代游刃有余,构建出卓越的软件产品。

用户评价

评分

我一直对 Go 语言在并发和网络编程方面的强大能力感到好奇,也听说过《The Go Programming Language》(中文译名《Go程序设计语言》)这本书在业界有着极高的声誉。虽然我目前还没有开始深入阅读这本书,但从我有限的了解和网络上的口碑来看,这本书似乎为我开启了一扇通往 Go 世界的大门。我特别期待书中能够深入浅出地讲解 Go 的核心概念,比如 Goroutines 和 Channels,这些是 Go 语言区别于其他语言的关键特性。我希望通过这本书,我能真正理解如何在 Go 中编写高效、可维护的并发程序,并能运用这些知识来解决实际开发中遇到的难题。

评分

作为一个对软件架构和系统设计充满热情的人,我一直在寻找能够深入理解现代编程语言设计理念的优秀读物。《The Go Programming Language》这本书,尽管我尚未翻阅,但从其在技术社区的讨论热度以及作者的声望来看,它很有可能提供了对 Go 语言设计哲学和底层原理的深刻洞察。我非常期待书中能够详细阐述 Go 语言是如何在简洁性、性能和并发性之间取得平衡的,以及它在构建可伸缩、高可用系统方面的优势。如果书中能够提供一些实际案例分析,展示 Go 如何被应用于大型项目,那将是锦上添工,让我能更直观地感受到 Go 的实用价值。

评分

对于许多经验丰富的开发者来说,掌握一门新的强大语言是不断提升自身竞争力的重要途径。而《The Go Programming Language》这本书,在我看来,很可能就是这样一本能够帮助我们拓展技术视野、提升编程技能的宝藏。我期望书中不仅仅是罗列 Go 的语法和特性,更重要的是能够提供一种“Goic”的编程思维方式,教会我们如何以 Go 的方式去思考和解决问题。如果书中能深入探讨 Go 语言在错误处理、内存管理、性能优化等方面的最佳实践,并结合实际项目经验进行讲解,那将对我帮助巨大,让我能够更快地将 Go 语言融入到我的实际工作中。

评分

我是一名初入编程领域的学生,正在寻找一门既有深度又有广度的语言来打下坚实的基础。《The Go Programming Language》这本书,即使我还没有实际阅读,光是“Go程序设计语言”这个名字就让我觉得它涵盖了从基础语法到高级特性的方方面面。我希望这本书能够循序渐进,从最基础的变量、数据类型讲起,然后逐步过渡到函数、接口、并发模型等更复杂的概念。我尤其看重的是,它是否能提供清晰的代码示例,帮助我理解抽象的理论知识,并鼓励我去动手实践,通过大量的练习来巩固所学,为我未来的编程生涯打下坚实的基础。

评分

我一直对探索不同编程语言的独特之处和设计哲学非常着迷。《The Go Programming Language》这本书,虽然我还没有亲身翻阅,但它在我心中已经勾勒出了一个清晰的轮廓:一本能够深刻解析 Go 语言精髓的著作。我非常期待它能以一种引人入胜的方式,带领读者走进 Go 的世界,去感受其简洁、高效的设计理念。如果书中能够深入剖析 Go 语言在构建现代化、分布式系统方面的独特优势,并提供一些具有启发性的设计模式和最佳实践,那将对我非常有价值。我希望这本书能够激发我进一步探索 Go 语言的潜能,并能够将其应用于我未来所从事的各类技术项目中。

评分

(≧▽≦)/内容不用说,非常赞,it必备的书,屯书中,不要拦我

评分

活动买的,经典的书籍,先备用了。

评分

近几年比较流行的语言,程序员有必要学习一下新技术。

评分

好书,送来包装无损!!!

评分

大神的作品,看过c程序设计语言,这次的go程序设计语言也应该不会令人失望的

评分

给老公买的,据说是经典

评分

好书,送来包装无损!!!

评分

后台 restful api 开发利器

评分

方便,快捷,整齐,认真,非常满意!

相关图书

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 book.teaonline.club All Rights Reserved. 图书大百科 版权所有