Hello,World
有人說(shuō)企蹭,程序員的最高榮譽(yù),是死后在墓碑上刻上“hello,world”闯第。
hello world這個(gè)例子龟劲,首次出現(xiàn)于1978年出版的C語(yǔ)言圣經(jīng)《The C Programming Language》屯蹦。C語(yǔ)言是直接影響Go語(yǔ)言設(shè)計(jì)的語(yǔ)言之一。這個(gè)例子體現(xiàn)了Go語(yǔ)言一些核心理念。
用go來(lái)寫hello world是這樣的。
package main
import "fmt"
func main() {
fmt.Println("Hello, World")
}
Go語(yǔ)言是一門靜態(tài)的編譯型語(yǔ)言肩豁,我們通常使用go build來(lái)編譯一個(gè)go文件。如剛才的helloworld.go辫呻。使用 go build helloworld.go 即可將剛才的helloworld.go編譯為一個(gè)可執(zhí)行的二進(jìn)制文件清钥。
利用go run helloworld.go 即可直接執(zhí)行,利用go get gopl.io/ch1/helloworld 即可將本文中的代碼下載到本地放闺。使用go help祟昭,我們可以查詢到更多的go命令。
Go is a tool for managing Go source code.
Usage:
go command [arguments]
The commands are:
build compile packages and dependencies
clean remove object files
doc show documentation for package or symbol
env print Go environment information
bug start a bug report
fix run go tool fix on packages
fmt run gofmt on package sources
generate generate Go files by processing source
get download and install packages and dependencies
install compile and install packages and dependencies
list list packages
run compile and run Go program
test test packages
tool run specified go tool
version print Go version
vet run go tool vet on packages
Use "go help [command]" for more information about a command.
Additional help topics:
c calling between Go and C
buildmode description of build modes
filetype file types
gopath GOPATH environment variable
environment environment variables
importpath import path syntax
packages description of package lists
testflag description of testing flags
testfunc description of testing functions
Use "go help [topic]" for more information about that topic.
Go語(yǔ)言的代碼是通過package(包)來(lái)組織的怖侦,package類似于其他語(yǔ)言里的libraries或者modules篡悟。一個(gè)package由位于同一個(gè)目錄下的一個(gè)或多個(gè).go源文件組成。每個(gè)源文件都以一條package聲明語(yǔ)句開始匾寝,這個(gè)例子里就是package main搬葬,表示該文件屬于那個(gè)package,緊跟著是一系列的導(dǎo)入(import)包艳悔,之后是存儲(chǔ)在這個(gè)文件里的程序語(yǔ)句踩萎。
Go的標(biāo)準(zhǔn)庫(kù)提供了100多個(gè)包,以支持常見功能很钓,如輸入香府、輸出、排序以及文本處理码倦。比如fmt包企孩,就含有格式化輸出、接收輸入的函數(shù)袁稽。Println是其中一個(gè)基礎(chǔ)函數(shù)勿璃,可以打印以空格間隔的一個(gè)或多個(gè)值,并在最后添加一個(gè)換行符推汽,從而輸出一整行补疑。
main包比較特殊。它定義了一個(gè)獨(dú)立可執(zhí)行的程序歹撒,而不是一個(gè)庫(kù)莲组。在main里的main 函數(shù) 也很特殊,它是整個(gè)程序執(zhí)行時(shí)的入口暖夭。main函數(shù)所做的事情就是程序做的锹杈。當(dāng)然了,main函數(shù)一般調(diào)用其它包里的函數(shù)完成很多工作, 比如fmt.Println迈着。
必須告訴編譯器源文件需要哪些包竭望,這就是import聲明以及隨后的package聲明扮演的角色。hello world例子只用到了一個(gè)包裕菠,大多數(shù)程序需要導(dǎo)入多個(gè)包咬清。
必須恰當(dāng)導(dǎo)入需要的包,缺少了必要的包或者導(dǎo)入了不需要的包奴潘,程序都無(wú)法編譯通過旧烧。這項(xiàng)嚴(yán)格要求避免了程序開發(fā)過程中引入未使用的包。Go也以此來(lái)提高其編譯速度萤彩。
import聲明必須跟在文件的package聲明之后粪滤。隨后,則是組成程序的函數(shù)雀扶、變量杖小、常量、類型的聲明語(yǔ)句(分別由關(guān)鍵字func, var, const, type定義)愚墓。這些內(nèi)容的聲明順序并不重要予权。這個(gè)例子的程序已經(jīng)盡可能短了,只聲明了一個(gè)函數(shù), 其中只調(diào)用了一個(gè)其他函數(shù)浪册。為了節(jié)省篇幅扫腺,有些時(shí)候, 示例程序會(huì)省略package和import聲明,但是村象,這些聲明在源代碼里有笆环,并且必須得有才能編譯攒至。
一個(gè)函數(shù)的聲明由func關(guān)鍵字、函數(shù)名躁劣、參數(shù)列表迫吐、返回值列表(這個(gè)例子里的main函數(shù)參數(shù)列表和返回值都是空的)以及包含在大括號(hào)里的函數(shù)體組成。第五章進(jìn)一步考察函數(shù)账忘。
Go語(yǔ)言不需要在語(yǔ)句或者聲明的末尾添加分號(hào)志膀,除非一行上有多條語(yǔ)句。實(shí)際上鳖擒,編譯器會(huì)主動(dòng)把特定符號(hào)后的換行符轉(zhuǎn)換為分號(hào), 因此換行符添加的位置會(huì)影響Go代碼的正確解析溉浙。舉個(gè)例子, 函數(shù)的左括號(hào){必須和func函數(shù)聲明在同一行上, 且位于末尾,不能獨(dú)占一行蒋荚,而在表達(dá)式x + y中戳稽,可在+后換行,不能在+前換行圆裕。
Go語(yǔ)言在代碼格式上采取了很強(qiáng)硬的態(tài)度广鳍。gofmt工具把代碼格式化為標(biāo)準(zhǔn)格式,并且go工具中的fmt子命令會(huì)對(duì)指定包, 否則默認(rèn)為當(dāng)前目錄, 中所有.go源文件應(yīng)用gofmt命令吓妆。本書中的所有代碼都被gofmt過赊时。你也應(yīng)該養(yǎng)成格式化自己的代碼的習(xí)慣。以法令方式規(guī)定標(biāo)準(zhǔn)的代碼格式可以避免無(wú)盡的無(wú)意義的瑣碎爭(zhēng)執(zhí)行拢。更重要的是祖秒,這樣可以做多種自動(dòng)源碼轉(zhuǎn)換,如果放任Go語(yǔ)言代碼格式舟奠,這些轉(zhuǎn)換就不大可能了竭缝。
很多文本編輯器都可以配置為保存文件時(shí)自動(dòng)執(zhí)行g(shù)ofmt,這樣你的源代碼總會(huì)被恰當(dāng)?shù)馗袷交犹薄_€有個(gè)相關(guān)的工具抬纸,goimports,可以根據(jù)代碼需要, 自動(dòng)地添加或刪除import聲明耿戚。這個(gè)工具并沒有包含在標(biāo)準(zhǔn)的分發(fā)包中湿故,可以用下面的命令安裝:
$ go get golang.org/x/tools/cmd/goimports
對(duì)于大多數(shù)用戶來(lái)說(shuō),下載膜蛔、編譯包坛猪、運(yùn)行測(cè)試用例、察看Go語(yǔ)言的文檔等等常用功能都可以用go的工具完成皂股。
Go語(yǔ)言的IDE很多墅茉,但是用的最舒適的一個(gè)還是Gogland。