回到简体

This commit is contained in:
chai2010
2016-02-15 11:06:34 +08:00
parent 9e878f9944
commit 2b37b23285
177 changed files with 2354 additions and 2354 deletions

View File

@@ -1,6 +1,6 @@
## 1.1. Hello, World
們以現已成爲傳統的“hello world”案例來開始吧, 這個例子首次出現於1978年出版的C語言聖經[《The C Programming Language》](http://s3-us-west-2.amazonaws.com/belllabs-microsite-dritchie/cbook/index.html)[^1]。C言是直接影Go語言設計的語言之一。這個例子體現了Go言一些核心理念。
们以现已成为传统的“hello world”案例来开始吧, 这个例子首次出现于1978年出版的C语言圣经[《The C Programming Language》](http://s3-us-west-2.amazonaws.com/belllabs-microsite-dritchie/cbook/index.html)[^1]。C言是直接影Go语言设计的语言之一。这个例子体现了Go言一些核心理念。
<u><i>gopl.io/ch1/helloworld</i></u>
```go
@@ -13,76 +13,76 @@ func main() {
}
```
Go是一門編譯型語Go言的工具鏈將源代及其依賴轉換成計算機的機器指令[^2]。Go言提供的工具都通過一個單獨的命令`go`調用,`go`命令有一列子命令。最簡單的一子命令就是run。這個命令編譯一個或多以.go尾的源文件,鏈接庫文件,併運行最生成的可行文件。(本使用$表示命令行提示符。)
Go是一门编译型语Go言的工具链将源代及其依赖转换成计算机的机器指令[^2]。Go言提供的工具都通过一个单独的命令`go`用,`go`命令有一列子命令。最简单的一子命令就是run。这个命令编译一个或多以.go尾的源文件,链接库文件,并运行最生成的可行文件。(本使用$表示命令行提示符。)
```
$ go run helloworld.go
```
意外,這個命令會輸出:
意外,这个命令会输出:
```
Hello, 世界
```
Go言原生支持Unicode它可以理全世界任何言的文本。
Go言原生支持Unicode它可以理全世界任何言的文本。
如果不是一次性實驗,你肯定希望能夠編譯這個程序,保存編譯結果以備將來之用。可以用build子命令
如果不是一次性实验,你肯定希望能够编译这个程序,保存编译结果以备将来之用。可以用build子命令
```
$ go build helloworld.go
```
這個命令生成一個名爲helloworld的可行的二進製文件[^3],之你可以隨時運行它[^4],不需任何理[^5]。
这个命令生成一个名为helloworld的可行的二进制文件[^3],之你可以随时运行它[^4],不需任何理[^5]。
```
$ ./helloworld
Hello, 世界
```
中, 所有的示例代上都有一行標記,利用這些標記, 可以[gopl.io](http://gopl.io)站上本書源碼倉庫里獲取代
中, 所有的示例代上都有一行标记,利用这些标记, 可以[gopl.io](http://gopl.io)站上本书源码仓库里获取代
```
gopl.io/ch1/helloworld
```
`go get gopl.io/ch1/helloworld` 命令,就會從網上獲取代碼,併放到對應目録中[^6]。2.6和10.7節有這方面更詳細的介
`go get gopl.io/ch1/helloworld` 命令,就会从网上获取代码,并放到对应目录中[^6]。2.6和10.7节有这方面更详细的介
來討論下程序本身。Go言的代碼通過**包**package組織,包類似於其它言里的libraries或者模modules。一包由位於單個目録下的一或多.go源代文件成, 目録定義包的作用。每源文件都以一`package`聲明語句開始,這個例子里就是`package main`, 表示文件屬於哪個包,跟着一繫列導import的包是存儲在這個文件里的程序句。
来讨论下程序本身。Go言的代码通过**包**package组织,包类似于其它言里的libraries或者模modules。一包由位于单个目录下的一或多.go源代文件成, 目录定义包的作用。每源文件都以一`package`声明语句开始,这个例子里就是`package main`, 表示文件属于哪个包,跟着一系列导import的包是存储在这个文件里的程序句。
Go的標準庫提供了100多包,以支持常功能,如入、出、排序以及文本理。比如`fmt`包,就含有格式化出、接收入的函`Println`是其中一個基礎函數,可以打印以空格隔的一或多值,在最添加一個換行符,從而輸出一整行。
Go的标准库提供了100多包,以支持常功能,如入、出、排序以及文本理。比如`fmt`包,就含有格式化出、接收入的函`Println`是其中一个基础函数,可以打印以空格隔的一或多值,在最添加一个换行符,从而输出一整行。
`main`包比特殊。它定了一個獨立可行的程序,而不是一個庫。在`main`里的`main` *函* 也很特殊,它是整程序執行時的入口[^7]。`main`所做的事情就是程序做的。然了,`main`一般調用其它包里的函完成很多工作, 比如`fmt.Println`
`main`包比特殊。它定了一个独立可行的程序,而不是一个库。在`main`里的`main` *函* 也很特殊,它是整程序执行时的入口[^7]。`main`所做的事情就是程序做的。然了,`main`一般用其它包里的函完成很多工作, 比如`fmt.Println`
須告訴編譯器源文件需要哪些包,就是`import`明以及隨後`package`明扮演的角色。hello world例子用到了一包,大多程序需要入多包。
须告诉编译器源文件需要哪些包,就是`import`明以及随后`package`明扮演的角色。hello world例子用到了一包,大多程序需要入多包。
須恰當導入需要的包,缺少了必要的包或者入了不需要的包,程序都無法編譯通過。這項嚴格要求避免了程序開發過程中引入未使用的包[^8]。
须恰当导入需要的包,缺少了必要的包或者入了不需要的包,程序都无法编译通过。这项严格要求避免了程序开发过程中引入未使用的包[^8]。
`import`明必跟在文件的`package`明之後。隨後,則是組成程序的函數、變量、常量、型的聲明語句(分别由關鍵`func`, `var`, `const`, `type`)。這些內容的聲明順序併不重要[^9]。這個例子的程序已經盡可能短了,隻聲明了一個函數, 其中隻調用了一其他函數。爲了節省篇幅,有些候, 示例程序省略`package``import`明,但是,這些聲明在源代里有,且必得有才能編譯
`import`明必跟在文件的`package`明之后。随后,则是组成程序的函数、变量、常量、型的声明语句(分别由关键`func`, `var`, `const`, `type`)。这些内容的声明顺序并不重要[^9]。这个例子的程序已经尽可能短了,只声明了一个函数, 其中只调用了一其他函数。为了节省篇幅,有些候, 示例程序省略`package``import`明,但是,这些声明在源代里有,且必得有才能编译
個函數的聲明由`func`關鍵字、函名、參數列表、返值列表(這個例子里的`main`數參數列表和返值都是空的)以及包含在大括里的函數體組成。第五章一步考察函
个函数的声明由`func`关键字、函名、参数列表、返值列表(这个例子里的`main`数参数列表和返值都是空的)以及包含在大括里的函数体组成。第五章一步考察函
Go言不需要在句或者明的末尾添加分,除非一行上有多條語句。實際上,編譯器會主動把特定符號後的換行符轉換爲分號, 因此行符添加的位置會影響Go代的正解析[^10]。。舉個例子, 函的左括`{``func`數聲明在同一行上, 且位末尾,不能占一行,而在表`x + y`中,可在`+`後換行,不能在`+`行。
Go言不需要在句或者明的末尾添加分,除非一行上有多条语句。实际上,编译器会主动把特定符号后的换行符转换为分号, 因此行符添加的位置会影响Go代的正解析[^10]。。举个例子, 函的左括`{``func`数声明在同一行上, 且位末尾,不能占一行,而在表`x + y`中,可在`+`后换行,不能在`+`行。
Go言在代格式上采取了很硬的度。`gofmt`工具把代格式化爲標準格式[^12]`go`工具中的`fmt`子命令會對指定包, 否則默認爲當前目, 中所有.go源文件`gofmt`命令。本中的所有代都被gofmt。你也應該養成格式化自己的代碼的習慣。以法令方式規定標準的代格式可以避免無盡的無意義的瑣碎爭執[^13]。更重要的是,這樣可以做多種自動源碼轉換如果放任Go言代格式,這些轉換就不大可能了。
Go言在代格式上采取了很硬的度。`gofmt`工具把代格式化为标准格式[^12]`go`工具中的`fmt`子命令会对指定包, 否则默认为当前目, 中所有.go源文件`gofmt`命令。本中的所有代都被gofmt。你也应该养成格式化自己的代码的习惯。以法令方式规定标准的代格式可以避免无尽的无意义的琐碎争执[^13]。更重要的是,这样可以做多种自动源码转换如果放任Go言代格式,这些转换就不大可能了。
很多文本編輯器都可以配置保存文件時自動執`gofmt`這樣你的源代碼總會被恰地格式化。還有個相關的工具,`goimports`,可以根據代碼需要, 自地添加或`import`明。這個工具併沒有包含在標準的分包中,可以用下面的命令安
很多文本编辑器都可以配置保存文件时自动执`gofmt`这样你的源代码总会被恰地格式化。还有个相关的工具,`goimports`,可以根据代码需要, 自地添加或`import`明。这个工具并没有包含在标准的分包中,可以用下面的命令安
```
$ go get golang.org/x/tools/cmd/goimports
```
對於大多數用戶來説,下載、編譯包、運行測試用例、察看Go言的文等等常用功能都可以用go的工具完成。10.7節詳細介紹這些知
对于大多数用户来说,下载、编译包、运行测试用例、察看Go言的文等等常用功能都可以用go的工具完成。10.7节详细介绍这些知
[^1]: 本作者之一Brian W. Kernighan也是《The C Programming Language》一的作者。
[^2]: 靜態編譯
[^3]: Windows繫統下生成的可行文件是helloworld.exe增加了.exe後綴名。
[^4]: 在Windows繫統下在命令行直接入helloworld.exe命令行。
[^5]: 因爲靜態編譯,所以不用心在繫統庫更新的時候衝突,幸福感滿滿
[^6]: 需要先安Git或Hg之的版本管理工具,併將對應的命令添加到PATH環境變量中。序言已提及,需要先置好GOPATH環境變量,下的代碼會放在`$GOPATH/src/gopl.io/ch1/helloworld`
[^7]: C繫語言差不多都這樣
[^8]: Go語言編譯過程沒有警告信息,爭議特性之一。
[^9]: 最好是定一下范。
[^10]: 比如行末是標識符、整、浮點數、虛數、字符或字符串文字、關鍵`break``continue``fallthrough``return`中的一個、運算符和分隔符`++``--``)``]``}`中的一
[^11]: 以+尾的話不會被插入分分隔符但是以x尾的話則會被分分隔符,從而導致編譯錯誤
[^12]: 這個格式化工具有任何可以調整代格式的參數Go言就是這麽任性。
[^13]: 也致了Go言的TIOBE排名低,因缺少撕逼的話題
[^1]: 本作者之一Brian W. Kernighan也是《The C Programming Language》一的作者。
[^2]: 静态编译
[^3]: Windows系统下生成的可行文件是helloworld.exe增加了.exe后缀名。
[^4]: 在Windows系统下在命令行直接入helloworld.exe命令行。
[^5]: 因为静态编译,所以不用心在系统库更新的时候冲突,幸福感满满
[^6]: 需要先安Git或Hg之的版本管理工具,并将对应的命令添加到PATH环境变量中。序言已提及,需要先置好GOPATH环境变量,下的代码会放在`$GOPATH/src/gopl.io/ch1/helloworld`
[^7]: C系语言差不多都这样
[^8]: Go语言编译过程没有警告信息,争议特性之一。
[^9]: 最好是定一下范。
[^10]: 比如行末是标识符、整、浮点数、虚数、字符或字符串文字、关键`break``continue``fallthrough``return`中的一个、运算符和分隔符`++``--``)``]``}`中的一
[^11]: 以+尾的话不会被插入分分隔符但是以x尾的话则会被分分隔符,从而导致编译错误
[^12]: 这个格式化工具有任何可以整代格式的参数Go言就是这么任性。
[^13]: 也致了Go言的TIOBE排名低,因缺少撕逼的话题