W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎勵(lì)
原文鏈接:https://gopl-zh.github.io/ch1/ch1-01.html
我們以現(xiàn)已成為傳統(tǒng)的“hello world”案例來開始吧,這個(gè)例子首次出現(xiàn)于 1978 年出版的 C 語言圣經(jīng) 《The C Programming Language》(譯注:本書作者之一 Brian W. Kernighan 也是《The C Programming Language》一書的作者)。C 語言是直接影響 Go 語言設(shè)計(jì)的語言之一。這個(gè)例子體現(xiàn)了 Go 語言一些核心理念。
gopl.io/ch1/helloworld
package main
import "fmt"
func main() {
fmt.Println("Hello, 世界")
}
Go 是一門編譯型語言,Go 語言的工具鏈將源代碼及其依賴轉(zhuǎn)換成計(jì)算機(jī)的機(jī)器指令(譯注:靜態(tài)編譯)。Go 語言提供的工具都通過一個(gè)單獨(dú)的命令 ?go
? 調(diào)用,?go
? 命令有一系列子命令。最簡單的一個(gè)子命令就是 ?run
?。這個(gè)命令編譯一個(gè)或多個(gè)以。?.go
? 結(jié)尾的源文件,鏈接庫文件,并運(yùn)行最終生成的可執(zhí)行文件。(本書使用$表示命令行提示符。)
$ go run helloworld.go
毫無意外,這個(gè)命令會輸出:
Hello, 世界
Go 語言原生支持 Unicode,它可以處理全世界任何語言的文本。
如果不只是一次性實(shí)驗(yàn),你肯定希望能夠編譯這個(gè)程序,保存編譯結(jié)果以備將來之用??梢杂?nbsp;?build
?子命令:
$ go build helloworld.go
這個(gè)命令生成一個(gè)名為 ?helloworld
?的可執(zhí)行的二進(jìn)制文件(譯注:Windows 系統(tǒng)下生成的可執(zhí)行文件是 ?helloworld.exe
?,增加了 ?.exe
? 后綴名),之后你可以隨時(shí)運(yùn)行它(譯注:在 Windows 系統(tǒng)下在命令行直接輸入 ?helloworld.exe
? 命令運(yùn)行),不需任何處理(譯注:因?yàn)殪o態(tài)編譯,所以不用擔(dān)心在系統(tǒng)庫更新的時(shí)候沖突,幸福感滿滿)。
$ ./helloworld
Hello, 世界
本書中所有示例代碼上都有一行標(biāo)記,利用這些標(biāo)記可以從 gopl.io 網(wǎng)站上本書源碼倉庫里獲取代碼:
gopl.io/ch1/helloworld
執(zhí)行 ?go get gopl.io/ch1/helloworld
? 命令,就會從網(wǎng)上獲取代碼,并放到對應(yīng)目錄中(需要先安裝 Git 或 Hg 之類的版本管理工具,并將對應(yīng)的命令添加到 ?PATH
?環(huán)境變量中。序言已經(jīng)提及,需要先設(shè)置好 ?GOPATH
?環(huán)境變量,下載的代碼會放在 ?$GOPATH/src/gopl.io/ch1/helloworld
? 目錄)。
2.6 和 10.7 節(jié)有這方面更詳細(xì)的介紹。
來討論下程序本身。Go 語言的代碼通過包(package)組織,包類似于其它語言里的庫(libraries)或者模塊(modules)。一個(gè)包由位于單個(gè)目錄下的一個(gè)或多個(gè) ?.go
? 源代碼文件組成,目錄定義包的作用。每個(gè)源文件都以一條 ?package
?聲明語句開始,這個(gè)例子里就是 ?package main
?,表示該文件屬于哪個(gè)包,緊跟著一系列導(dǎo)入(import)的包,之后是存儲在這個(gè)文件里的程序語句。
Go 的標(biāo)準(zhǔn)庫提供了 100 多個(gè)包,以支持常見功能,如輸入、輸出、排序以及文本處理。比如 ?fmt
?包,就含有格式化輸出、接收輸入的函數(shù)。?Println
?是其中一個(gè)基礎(chǔ)函數(shù),可以打印以空格間隔的一個(gè)或多個(gè)值,并在最后添加一個(gè)換行符,從而輸出一整行。
?main
?包比較特殊。它定義了一個(gè)獨(dú)立可執(zhí)行的程序,而不是一個(gè)庫。在 ?main
?里的 ?main
?函數(shù)也很特殊,它是整個(gè)程序執(zhí)行時(shí)的入口(譯注:C 系語言差不多都這樣)。?main
?函數(shù)所做的事情就是程序做的。當(dāng)然了,?main
?函數(shù)一般調(diào)用其它包里的函數(shù)完成很多工作(如:?fmt.Println
?)。
必須告訴編譯器源文件需要哪些包,這就是跟隨在 ?package
?聲明后面的 ?import
?聲明扮演的角色。?hello world
? 例子只用到了一個(gè)包,大多數(shù)程序需要導(dǎo)入多個(gè)包。
必須恰當(dāng)導(dǎo)入需要的包,缺少了必要的包或者導(dǎo)入了不需要的包,程序都無法編譯通過。這項(xiàng)嚴(yán)格要求避免了程序開發(fā)過程中引入未使用的包(譯注:Go 語言編譯過程沒有警告信息,爭議特性之一)。
?import
?聲明必須跟在文件的 ?package
?聲明之后。隨后,則是組成程序的函數(shù)、變量、常量、類型的聲明語句(分別由關(guān)鍵字 ?func
?、?var
?、?const
?、?type
?定義)。這些內(nèi)容的聲明順序并不重要(譯注:最好還是定一下規(guī)范)。這個(gè)例子的程序已經(jīng)盡可能短了,只聲明了一個(gè)函數(shù),其中只調(diào)用了一個(gè)其他函數(shù)。為了節(jié)省篇幅,有些時(shí)候示例程序會省略 ?package
?和 ?import
?聲明,但是,這些聲明在源代碼里有,并且必須得有才能編譯。
一個(gè)函數(shù)的聲明由 ?func
?關(guān)鍵字、函數(shù)名、參數(shù)列表、返回值列表(這個(gè)例子里的 ?main
?函數(shù)參數(shù)列表和返回值都是空的)以及包含在大括號里的函數(shù)體組成。第五章進(jìn)一步考察函數(shù)。
Go 語言不需要在語句或者聲明的末尾添加分號,除非一行上有多條語句。實(shí)際上,編譯器會主動把特定符號后的換行符轉(zhuǎn)換為分號,因此換行符添加的位置會影響 Go 代碼的正確解析(譯注:比如行末是標(biāo)識符、整數(shù)、浮點(diǎn)數(shù)、虛數(shù)、字符或字符串文字、關(guān)鍵字 ?break
?、?continue
?、?fallthrough
?或 ?return
?中的一個(gè)、運(yùn)算符和分隔符 ?++
?、?--
?、?)
?、?]
? 或 ?}
? 中的一個(gè))。舉個(gè)例子,函數(shù)的左括號 ?{
? 必須和 ?func
?函數(shù)聲明在同一行上,且位于末尾,不能獨(dú)占一行,而在表達(dá)式 ?x+y
? 中,可在 ?+
? 后換行,不能在 ?+
? 前換行(譯注:以+結(jié)尾的話不會被插入分號分隔符,但是以 x 結(jié)尾的話則會被分號分隔符,從而導(dǎo)致編譯錯(cuò)誤)。
Go 語言在代碼格式上采取了很強(qiáng)硬的態(tài)度。?gofmt
?工具把代碼格式化為標(biāo)準(zhǔn)格式(譯注:這個(gè)格式化工具沒有任何可以調(diào)整代碼格式的參數(shù),Go 語言就是這么任性),并且 ?go
?工具中的 ?fmt
?子命令會對指定包,否則默認(rèn)為當(dāng)前目錄中所有。go 源文件應(yīng)用 ?gofmt
?命令。本書中的所有代碼都被 gofmt 過。你也應(yīng)該養(yǎng)成格式化自己的代碼的習(xí)慣。以法令方式規(guī)定標(biāo)準(zhǔn)的代碼格式可以避免無盡的無意義的瑣碎爭執(zhí)(譯注:也導(dǎo)致了 Go 語言的 TIOBE 排名較低,因?yàn)槿鄙偎罕频脑掝})。更重要的是,這樣可以做多種自動源碼轉(zhuǎn)換,如果放任 Go 語言代碼格式,這些轉(zhuǎn)換就不大可能了。
很多文本編輯器都可以配置為保存文件時(shí)自動執(zhí)行 ?gofmt
?,這樣你的源代碼總會被恰當(dāng)?shù)馗袷交?。還有個(gè)相關(guān)的工具:?goimports
?,可以根據(jù)代碼需要,自動地添加或刪除 ?import
?聲明。這個(gè)工具并沒有包含在標(biāo)準(zhǔn)的分發(fā)包中,可以用下面的命令安裝:
$ go get golang.org/x/tools/cmd/goimports
對于大多數(shù)用戶來說,下載、編譯包、運(yùn)行測試用例、察看 Go 語言的文檔等等常用功能都可以用 go 的工具完成。10.7 節(jié)詳細(xì)介紹這些知識。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: