编辑: kieth | 2019-08-11 |
1 1.2 1.3 1.4 1.5 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.7 1.7.1 1.7.2 1.7.3 1.7.4 1.7.5 1.8 目录 Go简易教程 关于本书 引言 准备工作 第1章 基础知识 1.1 编译 1.2 静态类型 1.3 类c语法 1.4 垃圾回收 1.5 运行go代码 1.6 导入包 1.7 变量和声明 1.8 函数声明 1.9 继续之前 第2章:结构体 2.1 声明和初始化 2.2 结构体上的函数 2.3 构造函数 2.4 new 2.5 结构体字段 2.6 组合 2.7 指针类型和值类型 2.8 继续之前 第3章:映射、数组和切片 3.1 数组 3.2 切片 3.3 映射 3.4 指针类型和值类型 3.5 继续之前 第4章:代码组织和接口
2 1.8.1 1.8.2 1.8.3 1.9 1.9.1 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.10 1.10.1 1.10.2 1.10.3 1.10.4 1.11 4.1 包4.2 接口 4.3 继续之前 第5章:go花絮 5.1 错误处理 5.2 defer 5.3 go语言风格 5.4 初始化的if 5.5 空接口和转换 5.6 字符串和字节数组 5.7 函数类型 5.8 继续之前 第6章:并发 6.1 go协程 6.2 同步 6.3 通道 6.4 继续之前 结论
3 《Go简易教程》 《The Little Go Book》中文译本,中文正式名《Go简易教程》. 目录 关于本书 引言 准备工作 第1章 基础知识 1.1 编译 1.2 静态类型 1.3 类c语法 1.4 垃圾回收 1.5 运行go代码 1.6 导入包 1.7 变量和声明 1.8 函数声明 1.9 继续之前 第2章:结构体 2.1 声明和初始化 2.2 结构体上的函数 2.3 构造函数 2.4 new 2.5 结构体字段 2.6 组合 2.7 指针类型和值类型 2.8 继续之前 第3章:映射、数组和切片 3.1 数组 3.2 切片 3.3 映射 3.4 指针类型和值类型 3.5 继续之前 第4章:代码组织和接口 Go简易教程
4 4.1 包4.2 接口 4.3 继续之前 第5章:go花絮 5.1 错误处理 5.2 defer 5.3 go语言风格 5.4 初始化的if 5.5 空接口和转换 5.6 字符串和字节数组 5.7 函数类型 5.8 继续之前 第6章:并发 6.1 go协程 6.2 同步 6.3 通道 6.4 继续之前 结论 翻译进度 结论 致谢 本书原作者:Karl Seguin 参与翻译人员: Jell 支持本书 如果你喜欢本书 《Go简易教程》,联系[email protected],可以参与到本书的翻译或 纠正工作中来,欢迎PR. 你也可以关注我的微信公众号:reborncodinglife,欢迎讨论交流! Go简易教程
5 授权许可 本书中的内容使用 CC BY-NC-SA 4.0(署名 - 非商业性使用 - 相同方式共享4.0许可协议)授权. Go简易教程
6 关于本书 授权许可 本书中的内容使用 CC BY-NC-SA 4.0(署名 - 非商业性使用 - 相同方式共享4.0许可协议)授权.你不必为此书付费. 你可以免费的复制、发布、修改或者展示此书.但是,这本书的版 权归原作者Karl Seguin所有,不要将此书用于商业目的. 关于许可证的全部内容你可以浏览以下网站: http://creativecommons.org/licenses/by-nc-sa/4.0/ 关于本书
7 最新版本 这本书的最新版本可以在以下网站获得: http://github.com/karlseguin/the-little-go-book 链接 目录 下一章:引言 关于本书
8 引言 当开始学习一门新的语言时,我总有一种既爱又恨的感觉.一方面,语言是我们做事情的基 础,即使是小的变化,也会带来明显的效果.当一些事情恍然大悟时,会给如何编程带来持 久的影响,并且能够重新定义你关于其他语言的期望.不利的一面是,语言设计是一个持续 的过程.学习新的关键字、系统类型、编码风格、新的库、社区和范例,似乎很难解释这些 需要付出许多努力.和那些我们必须学习的事相比较,花费时间去学习新语言常让人觉得不 值得. 也就是说,我们必须愿意采用渐进的步骤,我们必须进步.因为语言是我们做事的基础.虽 然语言一直在变化,但是它们趋向于一个更广阔的范围,并且会影响生产力、可读性、可靠 性、性能、可测试性、依赖管理、错误处理、文档、性能分析、社区和标准库等等.难道说 千刀万剐导致的死亡是一种积极方式? 这也给我们留下了一个重要的问题,为什么是go语言?对我来说,有两个令人信服的原因. 第一,这是个相对简单的语言,它有一个相对简单的标准库.在很多方面,go语言渐进的性 质,将简化一些我们过去几十年所看到的增加到语言上的复杂性.第二,对于大多数开发 者,这将会补充你现有的语言工具库. go被创建成一种系统语言(比如,操作系统和设备驱动),go是针对C/C++开发者的.据go 核心开发组说,我可以确定是真的,应用程序开发者已经成为主要的go语言用户,而不是系 统开发者.为什么呢?我不能代表所有的系统开发人员,但是,对于构建网站、服务和桌面 应用等而言,主要归结于一类新兴系统的需求,这类系统介于低级系统应用和高级系统应用 之间. 可能go语言有消息传递机制、带缓存、重计算数据分析、命令行接口、日志或监控,我不知 道给go语言什么样的标签,但是在我的职业生涯中,由于系统持续增长的复杂性和成千上万 种常用的并发方式,很明显,定制基础设施系统,是一个不断增长的需求.你可以用ruby或python或别的语言建立这样的系统(好多人这么做),但是这类系统受益于更严格类型系统 和更高性能.同样地,你可以用go语言构建网站(也有好多人这么做),但是话又说回来,我还 是喜欢通过表达性更强的Node或Ruby来实现这样的系统. go语言还擅长于其他的领域.比如,当运行一个编译过的go程序时,它没有依赖性.你不必 担心用户是否安装了ruby或者jvm,而且如果是这样,还要考虑是什么版本.出于这个原因, go作为命令行界面程序和其他并发类型应用程序的开发语言(例如日志收集),变得越来越 流行. 坦白地说,学习go语言可以有效的利用你的时间.你不必花大量的时间去学习或者掌握它, 你从你的努力中最终会得到一些实用的东西. 作者注解 引言
9 我犹豫地写下这本书,有两个原因.首先,是由于go语言官方文档已经很完善了,特别是 《Effective Go》.另一个原因是我在写一本介绍语言类的书时有点不安.当我写《The Little MongoDB Book》这本书时,我已经假设大多数读者理解关系型数据库和建模的基本知识. 写《The Little Redis Book》时,你也可以做出类似的假设,即读者已经可以往redis中插入键 值,然后从redis中查询该键值. 据我说知,前面这些章节,我不能再做出相同的假设.你花多长时间学习接口并理解它,这 是个新的概念.比起go语言拥有的接口,其他人家是否需要更多?最终,如果你告诉我本书 那些地方太浅或者太详细,考虑到这本书的价值,我会感到欣慰. 链接 目录 上一章:关于本书 下一章:准备工作 引言
10 准备工作 链接 目录 上一章:引言 下一章:第1章 准备工作
11 第1章 基础知识 go是一种编译型、具有静态类型和类c风格语法的语言,并具备垃圾回收机制,这意味着什么 呢? 链接 目录 上一章:准备工作 下一节:编译 第1章 基础知识
12 1.1 编译 编译是一个将源代码翻译成更低级语言的过程,例如汇编语言(例如go就是如此),或者其 他中间语言(例如java和c#). 编译型语言在使用过程中会有点不爽,因为编译比较慢.如果编译不得不花掉几十分钟或者 几个小时,在快速迭代开发时往往是难以实现的.在设计go语言时,编译速度是主要的设计 目标之一.对于大项目开发人员来说,这里有一个好消息,通过解释型语言,我们常能获得 快速的反馈周期. 编译型语言倾向于运行得更快且在运行时没有额外的依赖关系(至少对于c、c++和go语言来 说,直接编译成汇编语言是可行的). 链接 目录 上一节:基础知识 下一节:静态类型 1.1 编译
13 1.2 静态类型 静态类型语言意味着变量必须指定一个类型,例如整型、字符串、布尔型和数组等.可以在 声明变量时指定变量类型,大多数情况下,让编译器自动去推断变量类型(我们将看到一些 简单的例子). 关于静态类型,有许多相关内容可以介绍,但是我相信,要理解静态类型最好的方法就是去 阅读代码.如果你使用过动态类型语言,你可能会觉得静态类型有点繁琐.你的想法没错, 但是静态类型也有很多优点,尤其编译静态类型的语言时.这2个观点经常被混为一谈.这是 一个事实,但这不是一个硬性规定,你可以拥有同时动态类型和静态类型的语言.在一些严 格类型的系统中,编译器只能检测程序的一些语法错误和更近一步的优化程序. 链接 目录 上一节:编译 下一节:类c语法 1.2 静态类型
14 1.3 类c语法 一般说一门语言具有类c语法意味着如果你习惯使用其他类c语言例如c、c++、java、 javascript和c#,然后你就会发现go语言也是类似,至少表面上是.例如,使用 &
&
表示一个 布尔运算 AND , == 用于相等比较, { 和 } 表示一个代码段的开始和结束,并且数组的索引 值是从0开始. 类c语法也意味着一行代码以分号结尾,条件语句使用圆括号.go语言不需要这2种方式,尽 管圆括号依然用于控制优先级.例如,一个 if 语句是这样的: if name == Leto { print( the spice must flow ) } 在更复杂的情况下,圆括号依然很有用: if (name == Goku &
&
power >
9000) || (name == gohan &
&
power <
4000) { print( super Saiyan ) } 除此之外,go比c#或者java更接近c,不但在语法上类似,还有一定的........