mirror of
https://github.com/gopl-zh/gopl-zh.github.com.git
synced 2025-12-20 12:44:20 +08:00
deploy: eb1938e3aa
This commit is contained in:
@@ -161,7 +161,7 @@
|
||||
<hr>
|
||||
|
||||
<h2 id="11-hello-world"><a class="header" href="#11-hello-world">1.1. Hello, World</a></h2>
|
||||
<p>我们以现已成为传统的“hello world”案例来开始吧,这个例子首次出现于1978年出版的C语言圣经<a href="http://s3-us-west-2.amazonaws.com/belllabs-microsite-dritchie/cbook/index.html">《The C Programming Language》</a>(译注:本书作者之一Brian W. Kernighan也是《The C Programming Language》一书的作者)。C语言是直接影响Go语言设计的语言之一。这个例子体现了Go语言一些核心理念。</p>
|
||||
<p>我们以现已成为传统的“hello world”案例来开始吧,这个例子首次出现于 1978 年出版的 C 语言圣经 <a href="http://s3-us-west-2.amazonaws.com/belllabs-microsite-dritchie/cbook/index.html">《The C Programming Language》</a>(译注:本书作者之一 Brian W. Kernighan 也是《The C Programming Language》一书的作者)。C 语言是直接影响 Go 语言设计的语言之一。这个例子体现了 Go 语言一些核心理念。</p>
|
||||
<p><u><i>gopl.io/ch1/helloworld</i></u></p>
|
||||
<pre><code class="language-go">package main
|
||||
|
||||
@@ -171,37 +171,37 @@ func main() {
|
||||
fmt.Println("Hello, 世界")
|
||||
}
|
||||
</code></pre>
|
||||
<p>Go是一门编译型语言,Go语言的工具链将源代码及其依赖转换成计算机的机器指令(译注:静态编译)。Go语言提供的工具都通过一个单独的命令<code>go</code>调用,<code>go</code>命令有一系列子命令。最简单的一个子命令就是run。这个命令编译一个或多个以.go结尾的源文件,链接库文件,并运行最终生成的可执行文件。(本书使用$表示命令行提示符。)</p>
|
||||
<pre><code>$ go run helloworld.go
|
||||
<p>Go 是一门编译型语言,Go 语言的工具链将源代码及其依赖转换成计算机的机器指令(译注:静态编译)。Go 语言提供的工具都通过一个单独的命令 <code>go</code> 调用,<code>go</code> 命令有一系列子命令。最简单的一个子命令就是 <code>run</code>。这个命令编译一个或多个以。<code>.go</code> 结尾的源文件,链接库文件,并运行最终生成的可执行文件。(本书使用$表示命令行提示符。)</p>
|
||||
<pre><code class="language-bash">$ go run helloworld.go
|
||||
</code></pre>
|
||||
<p>毫无意外,这个命令会输出:</p>
|
||||
<pre><code>Hello, 世界
|
||||
<pre><code class="language-text">Hello, 世界
|
||||
</code></pre>
|
||||
<p>Go语言原生支持Unicode,它可以处理全世界任何语言的文本。</p>
|
||||
<p>如果不只是一次性实验,你肯定希望能够编译这个程序,保存编译结果以备将来之用。可以用build子命令:</p>
|
||||
<pre><code>$ go build helloworld.go
|
||||
<p>Go 语言原生支持 Unicode,它可以处理全世界任何语言的文本。</p>
|
||||
<p>如果不只是一次性实验,你肯定希望能够编译这个程序,保存编译结果以备将来之用。可以用 <code>build</code> 子命令:</p>
|
||||
<pre><code class="language-shell">$ go build helloworld.go
|
||||
</code></pre>
|
||||
<p>这个命令生成一个名为helloworld的可执行的二进制文件(译注:Windows系统下生成的可执行文件是helloworld.exe,增加了.exe后缀名),之后你可以随时运行它(译注:在Windows系统下在命令行直接输入helloworld.exe命令运行),不需任何处理(译注:因为静态编译,所以不用担心在系统库更新的时候冲突,幸福感满满)。</p>
|
||||
<p>这个命令生成一个名为 <code>helloworld</code> 的可执行的二进制文件(译注:Windows 系统下生成的可执行文件是 <code>helloworld.exe</code>,增加了 <code>.exe</code> 后缀名),之后你可以随时运行它(译注:在 Windows 系统下在命令行直接输入 <code>helloworld.exe</code> 命令运行),不需任何处理(译注:因为静态编译,所以不用担心在系统库更新的时候冲突,幸福感满满)。</p>
|
||||
<pre><code>$ ./helloworld
|
||||
Hello, 世界
|
||||
</code></pre>
|
||||
<p>本书中所有示例代码上都有一行标记,利用这些标记可以从<a href="http://gopl.io">gopl.io</a>网站上本书源码仓库里获取代码:</p>
|
||||
<pre><code>gopl.io/ch1/helloworld
|
||||
<p>本书中所有示例代码上都有一行标记,利用这些标记可以从 <a href="http://gopl.io">gopl.io</a> 网站上本书源码仓库里获取代码:</p>
|
||||
<pre><code class="language-text">gopl.io/ch1/helloworld
|
||||
</code></pre>
|
||||
<p>执行 <code>go get gopl.io/ch1/helloworld</code> 命令,就会从网上获取代码,并放到对应目录中(需要先安装Git或Hg之类的版本管理工具,并将对应的命令添加到PATH环境变量中。序言已经提及,需要先设置好GOPATH环境变量,下载的代码会放在<code>$GOPATH/src/gopl.io/ch1/helloworld</code>目录)。2.6和10.7节有这方面更详细的介绍。</p>
|
||||
<p>来讨论下程序本身。Go语言的代码通过<strong>包</strong>(package)组织,包类似于其它语言里的库(libraries)或者模块(modules)。一个包由位于单个目录下的一个或多个.go源代码文件组成,目录定义包的作用。每个源文件都以一条<code>package</code>声明语句开始,这个例子里就是<code>package main</code>,表示该文件属于哪个包,紧跟着一系列导入(import)的包,之后是存储在这个文件里的程序语句。</p>
|
||||
<p>Go的标准库提供了100多个包,以支持常见功能,如输入、输出、排序以及文本处理。比如<code>fmt</code>包,就含有格式化输出、接收输入的函数。<code>Println</code>是其中一个基础函数,可以打印以空格间隔的一个或多个值,并在最后添加一个换行符,从而输出一整行。</p>
|
||||
<p><code>main</code>包比较特殊。它定义了一个独立可执行的程序,而不是一个库。在<code>main</code>里的<code>main</code> <em>函数</em> 也很特殊,它是整个程序执行时的入口(译注:C系语言差不多都这样)。<code>main</code>函数所做的事情就是程序做的。当然了,<code>main</code>函数一般调用其它包里的函数完成很多工作(如:<code>fmt.Println</code>)。</p>
|
||||
<p>必须告诉编译器源文件需要哪些包,这就是跟随在<code>package</code>声明后面的<code>import</code>声明扮演的角色。hello world例子只用到了一个包,大多数程序需要导入多个包。</p>
|
||||
<p>必须恰当导入需要的包,缺少了必要的包或者导入了不需要的包,程序都无法编译通过。这项严格要求避免了程序开发过程中引入未使用的包(译注:Go语言编译过程没有警告信息,争议特性之一)。</p>
|
||||
<p><code>import</code>声明必须跟在文件的<code>package</code>声明之后。随后,则是组成程序的函数、变量、常量、类型的声明语句(分别由关键字<code>func</code>、<code>var</code>、<code>const</code>、<code>type</code>定义)。这些内容的声明顺序并不重要(译注:最好还是定一下规范)。这个例子的程序已经尽可能短了,只声明了一个函数,其中只调用了一个其他函数。为了节省篇幅,有些时候示例程序会省略<code>package</code>和<code>import</code>声明,但是,这些声明在源代码里有,并且必须得有才能编译。</p>
|
||||
<p>一个函数的声明由<code>func</code>关键字、函数名、参数列表、返回值列表(这个例子里的<code>main</code>函数参数列表和返回值都是空的)以及包含在大括号里的函数体组成。第五章进一步考察函数。</p>
|
||||
<p>Go语言不需要在语句或者声明的末尾添加分号,除非一行上有多条语句。实际上,编译器会主动把特定符号后的换行符转换为分号,因此换行符添加的位置会影响Go代码的正确解析(译注:比如行末是标识符、整数、浮点数、虚数、字符或字符串文字、关键字<code>break</code>、<code>continue</code>、<code>fallthrough</code>或<code>return</code>中的一个、运算符和分隔符<code>++</code>、<code>--</code>、<code>)</code>、<code>]</code>或<code>}</code>中的一个)。举个例子,函数的左括号<code>{</code>必须和<code>func</code>函数声明在同一行上,且位于末尾,不能独占一行,而在表达式<code>x + y</code>中,可在<code>+</code>后换行,不能在<code>+</code>前换行(译注:以+结尾的话不会被插入分号分隔符,但是以x结尾的话则会被分号分隔符,从而导致编译错误)。</p>
|
||||
<p>Go语言在代码格式上采取了很强硬的态度。<code>gofmt</code>工具把代码格式化为标准格式(译注:这个格式化工具没有任何可以调整代码格式的参数,Go语言就是这么任性),并且<code>go</code>工具中的<code>fmt</code>子命令会对指定包,否则默认为当前目录中所有.go源文件应用<code>gofmt</code>命令。本书中的所有代码都被gofmt过。你也应该养成格式化自己的代码的习惯。以法令方式规定标准的代码格式可以避免无尽的无意义的琐碎争执(译注:也导致了Go语言的TIOBE排名较低,因为缺少撕逼的话题)。更重要的是,这样可以做多种自动源码转换,如果放任Go语言代码格式,这些转换就不大可能了。</p>
|
||||
<p>很多文本编辑器都可以配置为保存文件时自动执行<code>gofmt</code>,这样你的源代码总会被恰当地格式化。还有个相关的工具,<code>goimports</code>,可以根据代码需要,自动地添加或删除<code>import</code>声明。这个工具并没有包含在标准的分发包中,可以用下面的命令安装:</p>
|
||||
<pre><code>$ go get golang.org/x/tools/cmd/goimports
|
||||
<p>执行 <code>go get gopl.io/ch1/helloworld</code> 命令,就会从网上获取代码,并放到对应目录中(需要先安装 Git 或 Hg 之类的版本管理工具,并将对应的命令添加到 <code>PATH</code> 环境变量中。序言已经提及,需要先设置好 <code>GOPATH</code> 环境变量,下载的代码会放在 <code>$GOPATH/src/gopl.io/ch1/helloworld</code> 目录)。<a href="../ch2/ch2-06.html">2.6</a> 和 <a href="../ch10/ch10-07.html">10.7 节</a>有这方面更详细的介绍。</p>
|
||||
<p>来讨论下程序本身。Go 语言的代码通过<strong>包</strong>(package)组织,包类似于其它语言里的库(libraries)或者模块(modules)。一个包由位于单个目录下的一个或多个 <code>.go</code> 源代码文件组成,目录定义包的作用。每个源文件都以一条 <code>package</code> 声明语句开始,这个例子里就是 <code>package main</code>,表示该文件属于哪个包,紧跟着一系列导入(import)的包,之后是存储在这个文件里的程序语句。</p>
|
||||
<p>Go 的标准库提供了 100 多个包,以支持常见功能,如输入、输出、排序以及文本处理。比如 <code>fmt</code> 包,就含有格式化输出、接收输入的函数。<code>Println</code> 是其中一个基础函数,可以打印以空格间隔的一个或多个值,并在最后添加一个换行符,从而输出一整行。</p>
|
||||
<p><code>main</code> 包比较特殊。它定义了一个独立可执行的程序,而不是一个库。在 <code>main</code> 里的 <code>main</code> <em>函数</em>也很特殊,它是整个程序执行时的入口(译注:C 系语言差不多都这样)。<code>main</code> 函数所做的事情就是程序做的。当然了,<code>main</code> 函数一般调用其它包里的函数完成很多工作(如:<code>fmt.Println</code>)。</p>
|
||||
<p>必须告诉编译器源文件需要哪些包,这就是跟随在 <code>package</code> 声明后面的 <code>import</code> 声明扮演的角色。<code>hello world</code> 例子只用到了一个包,大多数程序需要导入多个包。</p>
|
||||
<p>必须恰当导入需要的包,缺少了必要的包或者导入了不需要的包,程序都无法编译通过。这项严格要求避免了程序开发过程中引入未使用的包(译注:Go 语言编译过程没有警告信息,争议特性之一)。</p>
|
||||
<p><code>import</code> 声明必须跟在文件的 <code>package</code> 声明之后。随后,则是组成程序的函数、变量、常量、类型的声明语句(分别由关键字 <code>func</code>、<code>var</code>、<code>const</code>、<code>type</code> 定义)。这些内容的声明顺序并不重要(译注:最好还是定一下规范)。这个例子的程序已经尽可能短了,只声明了一个函数,其中只调用了一个其他函数。为了节省篇幅,有些时候示例程序会省略 <code>package</code> 和 <code>import</code> 声明,但是,这些声明在源代码里有,并且必须得有才能编译。</p>
|
||||
<p>一个函数的声明由 <code>func</code> 关键字、函数名、参数列表、返回值列表(这个例子里的 <code>main</code> 函数参数列表和返回值都是空的)以及包含在大括号里的函数体组成。第五章进一步考察函数。</p>
|
||||
<p>Go 语言不需要在语句或者声明的末尾添加分号,除非一行上有多条语句。实际上,编译器会主动把特定符号后的换行符转换为分号,因此换行符添加的位置会影响 Go 代码的正确解析(译注:比如行末是标识符、整数、浮点数、虚数、字符或字符串文字、关键字 <code>break</code>、<code>continue</code>、<code>fallthrough</code>或 <code>return</code> 中的一个、运算符和分隔符 <code>++</code>、<code>--</code>、<code>)</code>、<code>]</code> 或 <code>}</code> 中的一个)。举个例子,函数的左括号 <code>{</code> 必须和 <code>func</code> 函数声明在同一行上,且位于末尾,不能独占一行,而在表达式 <code>x+y</code> 中,可在 <code>+</code> 后换行,不能在 <code>+</code> 前换行(译注:以+结尾的话不会被插入分号分隔符,但是以 x 结尾的话则会被分号分隔符,从而导致编译错误)。</p>
|
||||
<p>Go 语言在代码格式上采取了很强硬的态度。<code>gofmt</code>工具把代码格式化为标准格式(译注:这个格式化工具没有任何可以调整代码格式的参数,Go 语言就是这么任性),并且 <code>go</code> 工具中的 <code>fmt</code> 子命令会对指定包,否则默认为当前目录中所有。go 源文件应用 <code>gofmt</code> 命令。本书中的所有代码都被 gofmt 过。你也应该养成格式化自己的代码的习惯。以法令方式规定标准的代码格式可以避免无尽的无意义的琐碎争执(译注:也导致了 Go 语言的 TIOBE 排名较低,因为缺少撕逼的话题)。更重要的是,这样可以做多种自动源码转换,如果放任 Go 语言代码格式,这些转换就不大可能了。</p>
|
||||
<p>很多文本编辑器都可以配置为保存文件时自动执行 <code>gofmt</code>,这样你的源代码总会被恰当地格式化。还有个相关的工具:<code>goimports</code>,可以根据代码需要,自动地添加或删除 <code>import</code> 声明。这个工具并没有包含在标准的分发包中,可以用下面的命令安装:</p>
|
||||
<pre><code class="language-shell">$ go get golang.org/x/tools/cmd/goimports
|
||||
</code></pre>
|
||||
<p>对于大多数用户来说,下载、编译包、运行测试用例、察看Go语言的文档等等常用功能都可以用go的工具完成。10.7节详细介绍这些知识。</p>
|
||||
<p>对于大多数用户来说,下载、编译包、运行测试用例、察看 Go 语言的文档等等常用功能都可以用 go 的工具完成。<a href="../ch10/ch10-07.html">10.7 节</a>详细介绍这些知识。</p>
|
||||
|
||||
|
||||
<!-- 公众号 -->
|
||||
|
||||
Reference in New Issue
Block a user