mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-08-12 01:21:38 +08:00
@@ -6,7 +6,7 @@ Go 语言起源 2007 年,并于 2009 年正式对外发布。它从 2009 年 9
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
图 1.1 Go 语言设计者:Griesemer、Thompson 和 Pike
|
<center>图 1.1 Go 语言设计者:Griesemer、Thompson 和 Pike</center>
|
||||||
|
|
||||||
在 2008 年年中,Go 语言的设计工作接近尾声,一些员工开始以全职工作状态投入到这个项目的编译器和运行实现上。Ian Lance Taylor 也加入到了开发团队中,并于 2008 年 5 月创建了一个 gcc 前端。
|
在 2008 年年中,Go 语言的设计工作接近尾声,一些员工开始以全职工作状态投入到这个项目的编译器和运行实现上。Ian Lance Taylor 也加入到了开发团队中,并于 2008 年 5 月创建了一个 gcc 前端。
|
||||||
|
|
||||||
@@ -32,11 +32,11 @@ Go 语言的官方网站是 [golang.org](http://golang.org),这个站点采用
|
|||||||
|
|
||||||
更多的信息详见 [github.com/golang/go](https://github.com/golang/go),Go 项目 Bug 追踪和功能预期详见 [github.com/golang/go/issues](https://github.com/golang/go/issues)。
|
更多的信息详见 [github.com/golang/go](https://github.com/golang/go),Go 项目 Bug 追踪和功能预期详见 [github.com/golang/go/issues](https://github.com/golang/go/issues)。
|
||||||
|
|
||||||
Go 通过以下的 Logo 来展示它的速度,并以囊地鼠(Gopher)作为它的吉祥物。
|
Go 通过以下的 Logo 来展示它的速度,并以囊地鼠 (Gopher) 作为它的吉祥物。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
图1.2 Go 语言 Logo
|
<center>图1.2 Go 语言 Logo</center>
|
||||||
|
|
||||||
谷歌邮件列表 [golang-nuts](http://groups.google.com/group/golang-nuts/) 非常活跃,每天的讨论和问题解答数以百计。
|
谷歌邮件列表 [golang-nuts](http://groups.google.com/group/golang-nuts/) 非常活跃,每天的讨论和问题解答数以百计。
|
||||||
|
|
||||||
|
@@ -48,7 +48,7 @@ Go 语言还能够在运行时进行反射相关的操作。
|
|||||||
|
|
||||||
使用 `go install` 能够很轻松地对第三方包进行部署。
|
使用 `go install` 能够很轻松地对第三方包进行部署。
|
||||||
|
|
||||||
此外,Go 语言还支持调用由 C 语言编写的海量库文件(第 3.9 节),从而能够将过去开发的软件进行快速迁移。
|
此外,Go 语言还支持调用由 C 语言编写的海量库文件([第 3.9 节](03.9.md)),从而能够将过去开发的软件进行快速迁移。
|
||||||
|
|
||||||
## 1.2.4 指导设计原则
|
## 1.2.4 指导设计原则
|
||||||
|
|
||||||
@@ -62,7 +62,7 @@ Go 语言有一种极简抽象艺术家的感觉,因为它只提供了一到
|
|||||||
|
|
||||||
Go 语言有一套完整的编码规范,你可以在 [Go 语言编码规范](http://golang.org/doc/go_spec.html) 页面进行查看。
|
Go 语言有一套完整的编码规范,你可以在 [Go 语言编码规范](http://golang.org/doc/go_spec.html) 页面进行查看。
|
||||||
|
|
||||||
它不像 Ruby 那样通过实现过程来定义编码规范。作为一门具有明确编码规范的语言,它要求可以采用不同的编译器如 gc 和 gccgo(第 2.1 节)进行编译工作,这对语言本身拥有更好的编码规范起到很大帮助。
|
它不像 Ruby 那样通过实现过程来定义编码规范。作为一门具有明确编码规范的语言,它要求可以采用不同的编译器如 gc 和 gccgo([第 2.1 节](02.1.md))进行编译工作,这对语言本身拥有更好的编码规范起到很大帮助。
|
||||||
|
|
||||||
[LALR](http://en.wikipedia.org/wiki/LALR_parser) 是 Go 语言的语法标准,你也可以在 [`src/cmd/internal/gc/go.y`](https://github.com/golang/go/blob/master/src%2Fcmd%2Finternal%2Fgc%2Fgo.y) 中查看到,这种语法标准在编译时不需要符号表来协助解析。
|
[LALR](http://en.wikipedia.org/wiki/LALR_parser) 是 Go 语言的语法标准,你也可以在 [`src/cmd/internal/gc/go.y`](https://github.com/golang/go/blob/master/src%2Fcmd%2Finternal%2Fgc%2Fgo.y) 中查看到,这种语法标准在编译时不需要符号表来协助解析。
|
||||||
|
|
||||||
@@ -70,11 +70,12 @@ Go 语言有一套完整的编码规范,你可以在 [Go 语言编码规范](h
|
|||||||
|
|
||||||
Go 语言从本质上(程序和结构方面)来实现并发编程。
|
Go 语言从本质上(程序和结构方面)来实现并发编程。
|
||||||
|
|
||||||
因为 Go 语言没有类和继承的概念,所以它和 Java 或 C++ 看起来并不相同。但是它通过接口(interface)的概念来实现多态性。Go 语言有一个清晰易懂的轻量级类型系统,在类型之间也没有层级之说。因此可以说这是一门混合型的语言。
|
因为 Go 语言没有类和继承的概念,所以它和 Java 或 C++ 看起来并不相同。但是它通过接口 (interface) 的概念来实现多态性。Go 语言有一个清晰易懂的轻量级类型系统,在类型之间也没有层级之说。因此可以说这是一门混合型的语言。
|
||||||
|
|
||||||
在传统的面向对象语言中,使用面向对象编程技术显得非常臃肿,它们总是通过复杂的模式来构建庞大的类型层级,这违背了编程语言应该提升生产力的宗旨。
|
在传统的面向对象语言中,使用面向对象编程技术显得非常臃肿,它们总是通过复杂的模式来构建庞大的类型层级,这违背了编程语言应该提升生产力的宗旨。
|
||||||
|
|
||||||
函数是 Go 语言中的基本构件,它们的使用方法非常灵活。在第六章,我们会看到 Go 语言在函数式编程方面的基本概念。
|
函数是 Go 语言中的基本构件,它们的使用方法非常灵活。在[第六章](06.0.md),我们会看到 Go 语言在函数式编程方面的基本概念。
|
||||||
|
|
||||||
|
|
||||||
Go 语言使用静态类型,所以它是类型安全的一门语言,加上通过构建到本地代码,程序的执行速度也非常快。
|
Go 语言使用静态类型,所以它是类型安全的一门语言,加上通过构建到本地代码,程序的执行速度也非常快。
|
||||||
|
|
||||||
@@ -96,9 +97,10 @@ Go 语言一个非常好的目标就是实现所谓的复杂事件处理([CEP]
|
|||||||
|
|
||||||
越来越多的谷歌内部的大型分布式应用程序都开始使用 Go 语言来开发,例如谷歌地球的一部分代码就是由 Go 语言完成的。
|
越来越多的谷歌内部的大型分布式应用程序都开始使用 Go 语言来开发,例如谷歌地球的一部分代码就是由 Go 语言完成的。
|
||||||
|
|
||||||
如果你想知道一些其它组织使用Go语言开发的实际应用项目,你可以到 [使用 Go 的组织](http://go-lang.cat-v.org/organizations-using-go) 页面进行查看。出于隐私保护的考虑,许多公司的项目都没有展示在这个页面。我们将会在第 21 章讨论到一个使用 Go 语言开发的大型存储区域网络(SAN)案例。
|
如果你想知道一些其它组织使用Go语言开发的实际应用项目,你可以到 [使用 Go 的组织](http://go-lang.cat-v.org/organizations-using-go) 页面进行查看。出于隐私保护的考虑,许多公司的项目都没有展示在这个页面。我们将会在[第 21 章](21.0.md) 讨论到一个使用 Go 语言开发的大型存储区域网络 (SAN) 案例。
|
||||||
|
|
||||||
在 Chrome 浏览器中内置了一款 Go 语言的编译器用于本地客户端(NaCl),这很可能会被用于在 Chrome OS 中执行 Go 语言开发的应用程序。
|
|
||||||
|
在 Chrome 浏览器中内置了一款 Go 语言的编译器用于本地客户端 (NaCl),这很可能会被用于在 Chrome OS 中执行 Go 语言开发的应用程序。
|
||||||
|
|
||||||
Go 语言可以在 Intel 或 ARM 处理器上运行,因此它也可以在安卓系统下运行,例如 Nexus 系列的产品。
|
Go 语言可以在 Intel 或 ARM 处理器上运行,因此它也可以在安卓系统下运行,例如 Nexus 系列的产品。
|
||||||
|
|
||||||
@@ -110,12 +112,12 @@ Go 语言可以在 Intel 或 ARM 处理器上运行,因此它也可以在安
|
|||||||
|
|
||||||
- 为了简化设计,不支持函数重载和操作符重载
|
- 为了简化设计,不支持函数重载和操作符重载
|
||||||
- 为了避免在 C/C++ 开发中的一些 Bug 和混乱,不支持隐式转换
|
- 为了避免在 C/C++ 开发中的一些 Bug 和混乱,不支持隐式转换
|
||||||
- Go 语言通过另一种途径实现面向对象设计(第 10-11 章)来放弃类和类型的继承
|
- Go 语言通过另一种途径实现面向对象设计(第 [10](10.0.md)-[11](11.0.md) 章)来放弃类和类型的继承
|
||||||
- 尽管在接口的使用方面(第 11 章)可以实现类似变体类型的功能,但本身不支持变体类型
|
- 尽管在接口的使用方面([第 11 章](11.0.md))可以实现类似变体类型的功能,但本身不支持变体类型
|
||||||
- 不支持动态加载代码
|
- 不支持动态加载代码
|
||||||
- 不支持动态链接库
|
- 不支持动态链接库
|
||||||
- 不支持泛型
|
- 不支持泛型
|
||||||
- 通过 `recover` 和 `panic` 来替代异常机制(第 13.2-3 节)
|
- 通过 `recover()` 和 `panic()` 来替代异常机制(第 [13.2](13.2.md)-[13.3](13.3.md) 节)
|
||||||
- 不支持静态变量
|
- 不支持静态变量
|
||||||
|
|
||||||
关于 Go 语言开发团队对于这些方面的讨论,你可以通过 [Go 常见问题](http://golang.org/doc/go_faq.html) 页面查看。
|
关于 Go 语言开发团队对于这些方面的讨论,你可以通过 [Go 常见问题](http://golang.org/doc/go_faq.html) 页面查看。
|
||||||
|
@@ -11,10 +11,10 @@ Go 语言开发团队开发了适用于以下操作系统的编译器:
|
|||||||
你可以获取以下平台上的 Go 1.4 源码和二进制文件:
|
你可以获取以下平台上的 Go 1.4 源码和二进制文件:
|
||||||
|
|
||||||
- Linux 2.6+:amd64、386 和 arm 架构
|
- Linux 2.6+:amd64、386 和 arm 架构
|
||||||
- Mac OS X(Snow Leopard + Lion):amd64 和 386 架构
|
- Mac OS X (Snow Leopard + Lion) :amd64 和 386 架构
|
||||||
- Windows 2000+:amd64 和 386 架构
|
- Windows 2000+:amd64 和 386 架构
|
||||||
|
|
||||||
对于非常底层的纯 Go 语言代码或者包而言,在各个操作系统平台上的可移植性是非常强的,只需要将源码拷贝到相应平台上进行编译即可,或者可以使用交叉编译来构建目标平台的应用程序(第 2.2 节)。但如果你打算使用 cgo 或者类似文件监控系统的软件,就需要根据实际情况进行相应地修改了。
|
对于非常底层的纯 Go 语言代码或者包而言,在各个操作系统平台上的可移植性是非常强的,只需要将源码拷贝到相应平台上进行编译即可,或者可以使用交叉编译来构建目标平台的应用程序([第 2.2 节](02.2.md))。但如果你打算使用 cgo 或者类似文件监控系统的软件,就需要根据实际情况进行相应地修改了。
|
||||||
|
|
||||||
1. Go 原生编译器 gc:
|
1. Go 原生编译器 gc:
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ Go 语言开发团队开发了适用于以下操作系统的编译器:
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
图2.1 gc 编译器支持的处理器架构
|
<center>图2.1 gc 编译器支持的处理器架构</center>
|
||||||
|
|
||||||
当你第一次看到这套命名系统的时候你会觉得很奇葩,不过这些命名都是来自于 Plan 9 项目。
|
当你第一次看到这套命名系统的时候你会觉得很奇葩,不过这些命名都是来自于 Plan 9 项目。
|
||||||
|
|
||||||
@@ -37,7 +37,7 @@ Go 语言开发团队开发了适用于以下操作系统的编译器:
|
|||||||
|
|
||||||
(相关的 C 编译器名称为 6c、8c 和 5c,相关的汇编器名称为 6a、8a 和 5a)
|
(相关的 C 编译器名称为 6c、8c 和 5c,相关的汇编器名称为 6a、8a 和 5a)
|
||||||
|
|
||||||
**标记(Flags)** 是指可以通过命令行设置可选参数来影响编译器或链接器的构建过程或得到一个特殊的目标结果。
|
**标记 (Flags)** 是指可以通过命令行设置可选参数来影响编译器或链接器的构建过程或得到一个特殊的目标结果。
|
||||||
|
|
||||||
可用的编译器标记如下:
|
可用的编译器标记如下:
|
||||||
|
|
||||||
@@ -54,7 +54,8 @@ Go 语言开发团队开发了适用于以下操作系统的编译器:
|
|||||||
-w 打印归类后的语法解析树
|
-w 打印归类后的语法解析树
|
||||||
-x 打印 lex tokens
|
-x 打印 lex tokens
|
||||||
|
|
||||||
从 Go 1.0.3 版本开始,不再使用 8g,8l 之类的指令进行程序的构建,取而代之的是统一的 `go build` 和 `go install` 等命令,而这些指令会自动调用相关的编译器或链接器。
|
从 Go 1.0.3 版本开始,不再使用 `8g`,`8l` 之类的指令进行程序的构建,取而代之的是统一的 `go build` 和 `go install` 等命令,而这些指令会自动调用相关的编译器或链接器。
|
||||||
|
|
||||||
|
|
||||||
如果你想获得更深层次的信息,你可以在目录 [`$GOROOT/src/cmd`](https://github.com/golang/go/tree/master/src/cmd) 下找到编译器和链接器的源代码。Go 语言本身是由 C 语言开发的,而不是 Go 语言(Go 1.5 开始自举)。词法分析程序是 GNU bison,语法分析程序是名为 [`$GOROOT/src/cmd/gc/go.y`](https://github.com/golang/go/blob/master/src%2Fcmd%2Finternal%2Fgc%2Fgo.y) 的 yacc 文件,它会在同一目录输出 `y.tab.{c,h}` 文件。如果你想知道更多有关构建过程的信息,你可以在 [`$GOROOT/src/make.bash`](https://github.com/golang/go/blob/master/src/make.bash) 中找到。
|
如果你想获得更深层次的信息,你可以在目录 [`$GOROOT/src/cmd`](https://github.com/golang/go/tree/master/src/cmd) 下找到编译器和链接器的源代码。Go 语言本身是由 C 语言开发的,而不是 Go 语言(Go 1.5 开始自举)。词法分析程序是 GNU bison,语法分析程序是名为 [`$GOROOT/src/cmd/gc/go.y`](https://github.com/golang/go/blob/master/src%2Fcmd%2Finternal%2Fgc%2Fgo.y) 的 yacc 文件,它会在同一目录输出 `y.tab.{c,h}` 文件。如果你想知道更多有关构建过程的信息,你可以在 [`$GOROOT/src/make.bash`](https://github.com/golang/go/blob/master/src/make.bash) 中找到。
|
||||||
|
|
||||||
@@ -66,13 +67,13 @@ Go 语言开发团队开发了适用于以下操作系统的编译器:
|
|||||||
|
|
||||||
从 Go 1 版本开始,gc 和 gccgo 在编译方面都有等价的功能。
|
从 Go 1 版本开始,gc 和 gccgo 在编译方面都有等价的功能。
|
||||||
|
|
||||||
3. 文件扩展名与包(package):
|
3. 文件扩展名与包 (package):
|
||||||
|
|
||||||
Go 语言源文件的扩展名很显然就是 `.go`。
|
Go 语言源文件的扩展名很显然就是 `.go`。
|
||||||
|
|
||||||
C 文件使用后缀名 `.c`,汇编文件使用后缀名 `.s`。所有的源代码文件都是通过包(packages)来组织。包含可执行代码的包文件在被压缩后使用扩展名 `.a`(AR 文档)。
|
C 文件使用后缀名 `.c`,汇编文件使用后缀名 `.s`。所有的源代码文件都是通过包 (packages) 来组织。包含可执行代码的包文件在被压缩后使用扩展名 `.a`(AR 文档)。
|
||||||
|
|
||||||
Go 语言的标准库(第 9.1 节)包文件在被安装后就是使用这种格式的文件。
|
Go 语言的标准库([第 9.1 节](09.1.md))包文件在被安装后就是使用这种格式的文件。
|
||||||
|
|
||||||
**注意** 当你在创建目录时,文件夹名称永远不应该包含空格,而应该使用下划线 "_" 或者其它一般符号代替。
|
**注意** 当你在创建目录时,文件夹名称永远不应该包含空格,而应该使用下划线 "_" 或者其它一般符号代替。
|
||||||
|
|
||||||
|
@@ -15,7 +15,7 @@ Go 编译器支持交叉编译,也就是说你可以在一台机器上构建
|
|||||||
|
|
||||||
- **$GOPATH** 默认采用和 `$GOROOT` 一样的值,但从 Go 1.1 版本开始,你必须修改为其它路径。它可以包含多个 Go 语言源码文件、包文件和可执行文件的路径,而这些路径下又必须分别包含三个规定的目录:`src`、`pkg` 和 `bin`,这三个目录分别用于存放源码文件、包文件和可执行文件。
|
- **$GOPATH** 默认采用和 `$GOROOT` 一样的值,但从 Go 1.1 版本开始,你必须修改为其它路径。它可以包含多个 Go 语言源码文件、包文件和可执行文件的路径,而这些路径下又必须分别包含三个规定的目录:`src`、`pkg` 和 `bin`,这三个目录分别用于存放源码文件、包文件和可执行文件。
|
||||||
- **$GOARM** 专门针对基于 arm 架构的处理器,它的值可以是 5 或 6,默认为 6。
|
- **$GOARM** 专门针对基于 arm 架构的处理器,它的值可以是 5 或 6,默认为 6。
|
||||||
- **$GOMAXPROCS** 用于设置应用程序可使用的处理器个数与核数,详见第 14.1.3 节。
|
- **$GOMAXPROCS** 用于设置应用程序可使用的处理器个数与核数,详见 [第 14.1.3 节](14.1.md)。
|
||||||
|
|
||||||
在接下来的章节中,我们将会讨论如何在 Linux、Mac OS X 和 Windows 上安装 Go 语言。在 FreeBSD 上的安装和 Linux 非常类似。开发团队正在尝试将 Go 语言移植到其它例如 OpenBSD、DragonFlyBSD、NetBSD、Plan 9、Haiku 和 Solaris 操作系统上,你可以在这个页面找到最近的动态:[Go Porting Efforts](http://go-lang.cat-v.org/os-ports)。
|
在接下来的章节中,我们将会讨论如何在 Linux、Mac OS X 和 Windows 上安装 Go 语言。在 FreeBSD 上的安装和 Linux 非常类似。开发团队正在尝试将 Go 语言移植到其它例如 OpenBSD、DragonFlyBSD、NetBSD、Plan 9、Haiku 和 Solaris 操作系统上,你可以在这个页面找到最近的动态:[Go Porting Efforts](http://go-lang.cat-v.org/os-ports)。
|
||||||
|
|
||||||
|
@@ -78,7 +78,7 @@
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
图 2.3 完成编译后在终端打印的信息
|
<center>图 2.3 完成编译后在终端打印的信息</center>
|
||||||
|
|
||||||
**注意事项**
|
**注意事项**
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
# 2.6 安装目录清单
|
# 2.6 安装目录清单
|
||||||
|
|
||||||
你的 Go 安装目录(`$GOROOT`)的文件夹结构应该如下所示:
|
你的 Go 安装目录 (`$GOROOT`) 的文件夹结构应该如下所示:
|
||||||
|
|
||||||
README.md, AUTHORS, CONTRIBUTORS, LICENSE
|
README.md, AUTHORS, CONTRIBUTORS, LICENSE
|
||||||
|
|
||||||
@@ -8,7 +8,7 @@ README.md, AUTHORS, CONTRIBUTORS, LICENSE
|
|||||||
- `/doc`:包含文档模版
|
- `/doc`:包含文档模版
|
||||||
- `/lib`:包含示例程序,代码工具,本地文档等
|
- `/lib`:包含示例程序,代码工具,本地文档等
|
||||||
- `/misc`:包含与支持 Go 编辑器有关的配置文件以及 cgo 的示例
|
- `/misc`:包含与支持 Go 编辑器有关的配置文件以及 cgo 的示例
|
||||||
- `/os_arch`:包含标准库的包的对象文件(`.a`)
|
- `/os_arch`:包含标准库的包的对象文件 (`.a`)
|
||||||
- `/src`:包含源代码构建脚本和标准库的包的完整源代码(Go 是一门开源语言)
|
- `/src`:包含源代码构建脚本和标准库的包的完整源代码(Go 是一门开源语言)
|
||||||
- `/src/cmd`:包含 Go 和 C 的编译器和命令行脚本
|
- `/src/cmd`:包含 Go 和 C 的编译器和命令行脚本
|
||||||
|
|
||||||
@@ -16,4 +16,4 @@ README.md, AUTHORS, CONTRIBUTORS, LICENSE
|
|||||||
|
|
||||||
- [目录](directory.md)
|
- [目录](directory.md)
|
||||||
- 上一节:[在 Windows 上安装 Go](02.5.md)
|
- 上一节:[在 Windows 上安装 Go](02.5.md)
|
||||||
- 下一节:[Go 运行时(runtime)](02.7.md)
|
- 下一节:[Go 运行时 (runtime)](02.7.md)
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
# 2.7 Go 运行时(runtime)
|
# 2.7 Go 运行时 (runtime)
|
||||||
|
|
||||||
尽管 Go 编译器产生的是本地可执行代码,这些代码仍旧运行在 Go 的 runtime(这部分的代码可以在 runtime 包中找到)当中。这个 runtime 类似 Java 和 .NET 语言所用到的虚拟机,它负责管理包括内存分配、垃圾回收(第 10.8 节)、栈处理、goroutine、channel、切片(slice)、map 和反射(reflection)等等。
|
尽管 Go 编译器产生的是本地可执行代码,这些代码仍旧运行在 Go 的 runtime(这部分的代码可以在 `runtime` 包中找到)当中。这个 runtime 类似 Java 和 .NET 语言所用到的虚拟机,它负责管理包括内存分配、垃圾回收([第 10.8 节](10.8.md))、栈处理、goroutine、channel、切片 (slice)、map 和反射 (reflection) 等等。
|
||||||
|
|
||||||
runtime 主要由 C 语言编写(Go 1.5 开始自举),并且是每个 Go 包的最顶级包。你可以在目录 [`$GOROOT/src/runtime`](https://github.com/golang/go/tree/master/src/runtime) 中找到相关内容。
|
runtime 主要由 C 语言编写(Go 1.5 开始自举),并且是每个 Go 包的最顶级包。你可以在目录 [`$GOROOT/src/runtime`](https://github.com/golang/go/tree/master/src/runtime) 中找到相关内容。
|
||||||
|
|
||||||
|
@@ -1,9 +1,9 @@
|
|||||||
# 2.8 Go 解释器
|
# 2.8 Go 解释器
|
||||||
|
|
||||||
因为 Go 具有像动态语言那样快速编译的能力,自然而然地就有人会问 Go 语言能否在 REPL(read-eval-print loop)编程环境下实现。Sebastien Binet 已经使用这种环境实现了一个 Go 解释器,你可以在这个页面找到:[https://github.com/sbinet/igo](https://github.com/sbinet/igo)。
|
因为 Go 具有像动态语言那样快速编译的能力,自然而然地就有人会问 Go 语言能否在 REPL (read-eval-print loop) 编程环境下实现。Sebastien Binet 已经使用这种环境实现了一个 Go 解释器,你可以在这个页面找到:[https://github.com/sbinet/igo](https://github.com/sbinet/igo)。
|
||||||
|
|
||||||
## 链接
|
## 链接
|
||||||
|
|
||||||
- [目录](directory.md)
|
- [目录](directory.md)
|
||||||
- 上一节:[Go 运行时(runtime)](02.7.md)
|
- 上一节:[Go 运行时 (runtime)](02.7.md)
|
||||||
- 下一章:[编辑器、集成开发环境与其它工具](03.0.md)
|
- 下一章:[编辑器、集成开发环境与其它工具](03.0.md)
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
# 3.0 编辑器、集成开发环境与其它工具
|
# 3.0 编辑器、集成开发环境与其它工具
|
||||||
|
|
||||||
因为 Go 语言还是一门相对年轻的编程语言,所以不管是在集成开发环境(IDE)还是相关的插件方面,发展都不是很成熟。不过目前还是有一些 IDE 能够较好地支持 Go 的开发,有些开发工具甚至是跨平台的,你可以在 Linux、Mac OS X 或者 Windows 下工作。
|
因为 Go 语言还是一门相对年轻的编程语言,所以不管是在集成开发环境 (IDE) 还是相关的插件方面,发展都不是很成熟。不过目前还是有一些 IDE 能够较好地支持 Go 的开发,有些开发工具甚至是跨平台的,你可以在 Linux、Mac OS X 或者 Windows 下工作。
|
||||||
|
|
||||||
你可以通过查阅 [编辑器和 IDE 扩展](http://go-lang.cat-v.org/text-editors/) 页面来获取 Go 开发工具的最新信息。
|
你可以通过查阅 [编辑器和 IDE 扩展](http://go-lang.cat-v.org/text-editors/) 页面来获取 Go 开发工具的最新信息。
|
||||||
|
|
||||||
|
@@ -19,7 +19,7 @@
|
|||||||
15. 拥有断点、检查变量值、单步执行、逐过程执行标识库中代码的能力。
|
15. 拥有断点、检查变量值、单步执行、逐过程执行标识库中代码的能力。
|
||||||
16. 能够方便的存取最近使用过的文件或项目。
|
16. 能够方便的存取最近使用过的文件或项目。
|
||||||
17. 拥有对包、类型、变量、函数和方法的智能代码补全的功能。
|
17. 拥有对包、类型、变量、函数和方法的智能代码补全的功能。
|
||||||
18. 能够对项目或包中的代码建立抽象语法树视图(AST-view)。
|
18. 能够对项目或包中的代码建立抽象语法树视图 (AST-view)。
|
||||||
19. 内置 Go 的相关工具。
|
19. 内置 Go 的相关工具。
|
||||||
20. 能够方便完整地查阅 Go 文档。
|
20. 能够方便完整地查阅 Go 文档。
|
||||||
21. 能够方便地在不同的 Go 环境之间切换。
|
21. 能够方便地在不同的 Go 环境之间切换。
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
你可以将 Linux 的文本编辑器 GEdit 改造成一个很好的 Go 开发工具。
|
你可以将 Linux 的文本编辑器 GEdit 改造成一个很好的 Go 开发工具。
|
||||||
|
|
||||||
**[Sublime Text](http://www.sublimetext.com)** 是一个革命性的跨平台(Linux、Mac OS X、Windows)文本编辑器,它支持编写非常多的编程语言代码。对于 Go 而言,它有一个插件叫做 [GoSublime](https://github.com/DisposaBoy/GoSublime) 来支持代码补全和代码模版。
|
**[Sublime Text](http://www.sublimetext.com)** 是一个革命性的跨平台 (Linux、Mac OS X、Windows)文本编辑器,它支持编写非常多的编程语言代码。对于 Go 而言,它有一个插件叫做 [GoSublime](https://github.com/DisposaBoy/GoSublime) 来支持代码补全和代码模版。
|
||||||
|
|
||||||
这里还有一些更加高级的 Go 开发工具,其中一些是以插件的形式利用本身是作为开发 Java 的工具。
|
这里还有一些更加高级的 Go 开发工具,其中一些是以插件的形式利用本身是作为开发 Java 的工具。
|
||||||
|
|
||||||
|
@@ -11,8 +11,8 @@
|
|||||||
- `%#v` 打印包括字段和限定类型名称在内的实例的完整信息
|
- `%#v` 打印包括字段和限定类型名称在内的实例的完整信息
|
||||||
- `%T` 打印某个类型的完整说明
|
- `%T` 打印某个类型的完整说明
|
||||||
|
|
||||||
3. 使用 panic 语句(第 13.2 节)来获取栈跟踪信息(直到 panic 时所有被调用函数的列表)。
|
3. 使用 `panic()` 语句([第 13.2 节](13.2.md))来获取栈跟踪信息(直到 `panic()` 时所有被调用函数的列表)。
|
||||||
4. 使用关键字 defer 来跟踪代码执行过程(第 6.4 节)。
|
4. 使用关键字 `defer` 来跟踪代码执行过程([第 6.4 节](06.4.md))。
|
||||||
|
|
||||||
## 链接
|
## 链接
|
||||||
|
|
||||||
|
@@ -1,12 +1,12 @@
|
|||||||
# 3.5 格式化代码
|
# 3.5 格式化代码
|
||||||
|
|
||||||
Go 开发团队不想要 Go 语言像许多其它语言那样总是在为代码风格而引发无休止的争论,浪费大量宝贵的开发时间,因此他们制作了一个工具:`go fmt`(`gofmt`)。这个工具可以将你的源代码格式化成符合官方统一标准的风格,属于语法风格层面上的小型重构。遵循统一的代码风格是 Go 开发中无可撼动的铁律,因此你必须在编译或提交版本管理系统之前使用 `gofmt` 来格式化你的代码。
|
Go 开发团队不想要 Go 语言像许多其它语言那样总是在为代码风格而引发无休止的争论,浪费大量宝贵的开发时间,因此他们制作了一个工具:`go fmt` (gofmt)。这个工具可以将你的源代码格式化成符合官方统一标准的风格,属于语法风格层面上的小型重构。遵循统一的代码风格是 Go 开发中无可撼动的铁律,因此你必须在编译或提交版本管理系统之前使用 gofmt 来格式化你的代码。
|
||||||
|
|
||||||
尽管这种做法也存在一些争论,但使用 `gofmt` 后你不再需要自成一套代码风格而是和所有人使用相同的规则。这不仅增强了代码的可读性,而且在接手外部 Go 项目时,可以更快地了解其代码的含义。此外,大多数开发工具也都内置了这一功能。
|
尽管这种做法也存在一些争论,但使用 gofmt 后你不再需要自成一套代码风格而是和所有人使用相同的规则。这不仅增强了代码的可读性,而且在接手外部 Go 项目时,可以更快地了解其代码的含义。此外,大多数开发工具也都内置了这一功能。
|
||||||
|
|
||||||
Go 对于代码的缩进层级方面使用 tab 还是空格并没有强制规定,一个 tab 可以代表 4 个或 8 个空格。在实际开发中,1 个 tab 应该代表 4 个空格,而在本身的例子当中,每个 tab 代表 8 个空格。至于开发工具方面,一般都是直接使用 tab 而不替换成空格。
|
Go 对于代码的缩进层级方面使用 tab 还是空格并没有强制规定,一个 tab 可以代表 4 个或 8 个空格。在实际开发中,1 个 tab 应该代表 4 个空格,而在本身的例子当中,每个 tab 代表 8 个空格。至于开发工具方面,一般都是直接使用 tab 而不替换成空格。
|
||||||
|
|
||||||
在命令行输入 `gofmt –w program.go` 会格式化该源文件的代码然后将格式化后的代码覆盖原始内容(如果不加参数 `-w` 则只会打印格式化后的结果而不重写文件);`gofmt -w *.go` 会格式化并重写所有 Go 源文件;`gofmt map1` 会格式化并重写 map1 目录及其子目录下的所有 Go 源文件。
|
在命令行输入 `gofmt –w program.go` 会格式化该源文件的代码然后将格式化后的代码覆盖原始内容(如果不加参数 `-w` 则只会打印格式化后的结果而不重写文件);`gofmt -w *.go` 会格式化并重写所有 Go 源文件;`gofmt map1` 会格式化并重写 `map1` 目录及其子目录下的所有 Go 源文件。
|
||||||
|
|
||||||
`gofmt` 也可以通过在参数 `-r` 后面加入用双引号括起来的替换规则实现代码的简单重构,规则的格式:`<原始内容> -> <替换内容>`。
|
`gofmt` 也可以通过在参数 `-r` 后面加入用双引号括起来的替换规则实现代码的简单重构,规则的格式:`<原始内容> -> <替换内容>`。
|
||||||
|
|
||||||
@@ -18,7 +18,7 @@ Go 对于代码的缩进层级方面使用 tab 还是空格并没有强制规定
|
|||||||
|
|
||||||
gofmt -r 'a[n:len(a)] -> a[n:]' –w *.go
|
gofmt -r 'a[n:len(a)] -> a[n:]' –w *.go
|
||||||
|
|
||||||
上面的代码会将源文件中多余的 `len(a)` 去掉。( **译者注:了解切片(slice)之后就明白这为什么是多余的了** )
|
上面的代码会将源文件中多余的 `len(a)` 去掉。( **译者注:了解切片 (slice) 之后就明白这为什么是多余的了** )
|
||||||
|
|
||||||
gofmt –r 'A.Func1(a,b) -> A.Func2(b,a)' –w *.go
|
gofmt –r 'A.Func1(a,b) -> A.Func2(b,a)' –w *.go
|
||||||
|
|
||||||
|
@@ -1,20 +1,20 @@
|
|||||||
# 3.6 生成代码文档
|
# 3.6 生成代码文档
|
||||||
|
|
||||||
`go doc` 工具会从 Go 程序和包文件中提取顶级声明的首行注释以及每个对象的相关注释,并生成相关文档。
|
godoc 工具会从 Go 程序和包文件中提取顶级声明的首行注释以及每个对象的相关注释,并生成相关文档。
|
||||||
|
|
||||||
它也可以作为一个提供在线文档浏览的 web 服务器,[http://golang.org](http://golang.org) 就是通过这种形式实现的。
|
它也可以作为一个提供在线文档浏览的 web 服务器,[http://golang.org](http://golang.org) 就是通过这种形式实现的。
|
||||||
|
|
||||||
**一般用法**
|
**一般用法**
|
||||||
|
|
||||||
- `go doc package` 获取包的文档注释,例如:`go doc fmt` 会显示使用 `godoc` 生成的 `fmt` 包的文档注释。
|
- `go doc package` 获取包的文档注释,例如:`go doc fmt` 会显示使用 godoc 生成的 `fmt` 包的文档注释。
|
||||||
- `go doc package/subpackage` 获取子包的文档注释,例如:`go doc container/list`。
|
- `go doc package/subpackage` 获取子包的文档注释,例如:`go doc container/list`。
|
||||||
- `go doc package function` 获取某个函数在某个包中的文档注释,例如:`go doc fmt Printf` 会显示有关 `fmt.Printf()` 的使用说明。
|
- `go doc package function` 获取某个函数在某个包中的文档注释,例如:`go doc fmt Printf` 会显示有关 `fmt.Printf()` 的使用说明。
|
||||||
|
|
||||||
这个工具只能获取在 Go 安装目录下 `../go/src` 中的注释内容。此外,它还可以作为一个本地文档浏览 web 服务器。在命令行输入 `godoc -http=:6060`,然后使用浏览器打开 [http://localhost:6060](http://localhost:6060) 后,你就可以看到本地文档浏览服务器提供的页面。
|
这个工具只能获取在 Go 安装目录下 `../go/src` 中的注释内容。此外,它还可以作为一个本地文档浏览 web 服务器。在命令行输入 `godoc -http=:6060`,然后使用浏览器打开 [http://localhost:6060](http://localhost:6060) 后,你就可以看到本地文档浏览服务器提供的页面。
|
||||||
|
|
||||||
`godoc` 也可以用于生成非标准库的 Go 源码文件的文档注释(第 9.6 章)。
|
godoc 也可以用于生成非标准库的 Go 源码文件的文档注释([第 9.6 章](09.6.md))。
|
||||||
|
|
||||||
如果想要获取更多有关 `godoc` 的信息,请访问该页面:[http://golang.org/cmd/godoc/](http://golang.org/cmd/godoc/)(在线版的第三方包 `godoc` 可以使用 [Go Walker](https://gowalker.org))。
|
如果想要获取更多有关 `godoc` 的信息,请访问该页面:[http://golang.org/cmd/godoc/](http://golang.org/cmd/godoc/)(在线版的第三方包 godoc 可以使用 [Go Walker](https://gowalker.org))。
|
||||||
|
|
||||||
## 链接
|
## 链接
|
||||||
|
|
||||||
|
@@ -4,7 +4,7 @@ Go 自带的工具集主要使用脚本和 Go 语言自身编写的,目前版
|
|||||||
|
|
||||||
- `go install` 是安装 Go 包的工具,类似 Ruby 中的 rubygems。主要用于安装非标准库的包文件,将源代码编译成对象文件。
|
- `go install` 是安装 Go 包的工具,类似 Ruby 中的 rubygems。主要用于安装非标准库的包文件,将源代码编译成对象文件。
|
||||||
- `go fix` 用于将你的 Go 代码从旧的发行版迁移到最新的发行版,它主要负责简单的、重复的、枯燥无味的修改工作,如果像 API 等复杂的函数修改,工具则会给出文件名和代码行数的提示以便让开发人员快速定位并升级代码。Go 开发团队一般也使用这个工具升级 Go 内置工具以及 谷歌内部项目的代码。`go fix` 之所以能够正常工作是因为 Go 在标准库就提供生成抽象语法树和通过抽象语法树对代码进行还原的功能。该工具会尝试更新当前目录下的所有 Go 源文件,并在完成代码更新后在控制台输出相关的文件名称。
|
- `go fix` 用于将你的 Go 代码从旧的发行版迁移到最新的发行版,它主要负责简单的、重复的、枯燥无味的修改工作,如果像 API 等复杂的函数修改,工具则会给出文件名和代码行数的提示以便让开发人员快速定位并升级代码。Go 开发团队一般也使用这个工具升级 Go 内置工具以及 谷歌内部项目的代码。`go fix` 之所以能够正常工作是因为 Go 在标准库就提供生成抽象语法树和通过抽象语法树对代码进行还原的功能。该工具会尝试更新当前目录下的所有 Go 源文件,并在完成代码更新后在控制台输出相关的文件名称。
|
||||||
- `go test` 是一个轻量级的单元测试框架(第 13 章)。
|
- `go test` 是一个轻量级的单元测试框架([第 13 章](13.0.md))。
|
||||||
|
|
||||||
## 链接
|
## 链接
|
||||||
|
|
||||||
|
@@ -41,7 +41,7 @@ func Seed(i int) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
C 当中并没有明确的字符串类型,如果你想要将一个 string 类型的变量从 Go 转换到 C 时,可以使用 `C.CString(s)`;同样,可以使用 `C.GoString(cs)` 从 C 转换到 Go 中的 string 类型。
|
C 当中并没有明确的字符串类型,如果你想要将一个 `string` 类型的变量从 Go 转换到 C 时,可以使用 `C.CString(s)`;同样,可以使用 `C.GoString(cs)` 从 C 转换到 Go 中的 `string` 类型。
|
||||||
|
|
||||||
Go 的内存管理机制无法管理通过 C 代码分配的内存。
|
Go 的内存管理机制无法管理通过 C 代码分配的内存。
|
||||||
|
|
||||||
@@ -72,7 +72,7 @@ func Print(s string) {
|
|||||||
|
|
||||||
**构建 cgo 包**
|
**构建 cgo 包**
|
||||||
|
|
||||||
你可以在使用将会在第 9.5 节讲到的 Makefile 文件(因为我们使用了一个独立的包),除了使用变量 GOFILES 之外,还需要使用变量 CGOFILES 来列出需要使用 cgo 编译的文件列表。例如,示例 3.2 中的代码就可以使用包含以下内容的 Makefile 文件来编译,你可以使用 gomake 或 make:
|
你可以在使用将会在第 9.5 节讲到的 Makefile 文件(因为我们使用了一个独立的包),除了使用变量 `GOFILES` 之外,还需要使用变量 `CGOFILES` 来列出需要使用 cgo 编译的文件列表。例如,示例 3.2 中的代码就可以使用包含以下内容的 `Makefile` 文件来编译,你可以使用 `gomake` 或 `make`:
|
||||||
|
|
||||||
include $(GOROOT)/src/Make.inc
|
include $(GOROOT)/src/Make.inc
|
||||||
TARG=rand
|
TARG=rand
|
||||||
|
Reference in New Issue
Block a user