在開始編寫應用之前,我們先從最基本的程式開始。就像你造房子之前不知道什麼是地基一樣,編寫程式也不知道如何開始。因此,在本節中,我們要學習用最基本的語法讓 Go 程式執行起來。
這就像一個傳統,在學習大部分語言之前,你先學會如何編寫一個可以輸出 hello world
的程式。
準備好了嗎?Let's Go!
package main
import "fmt"
func main() {
fmt.Printf("Hello, world or 你好,世界 or καλημ ́ρα κóσμ or こんにちはせかい\n")
}
輸出如下:
Hello, world or 你好,世界 or καλημ ́ρα κóσμ or こんにちはせかい
首先我們要了解一個概念,Go 程式是透過 package
來組織的。
package <pkgName>
(在我們的例子中是package main
)這一行告訴我們當前檔案屬於哪個套件,而套件名 main
則告訴我們它是一個可獨立執行的套件,它在編譯後會產生可執行檔案。除了 main
套件之外,其它的套件最後都會產生 *.a
檔案(也就是套件檔案)並放置在 $GOPATH/pkg/$GOOS_$GOARCH
中(以 Mac 為例就是 $GOPATH/pkg/darwin_amd64
)。
每一個可獨立執行的 Go 程式,必定包含一個
package main
,在這個main
套件中必定包含一個入口函式main
,而這個函式既沒有參數,也沒有回傳值。
為了列印 Hello, world...
,我們呼叫了一個函式 Printf
,這個函式來自於 fmt
套件,所以我們在第三行中匯入了系統級別的 fmt
套件:import "fmt"
。
套件的概念和 Python 中的 package 類似,它們都有一些特別的好處:模組化(能夠把你的程式分成多個模組)和可重用性(每個模組都能被其它應用程式反覆使用)。我們在這裡只是先了解一下套件的概念,後面我們將會編寫自己的套件。
在第五行中,我們透過關鍵字 func
定義了一個 main
函式,函式體被放在 {}
(大括號)中,就像我們平時寫 C、C++ 或 Java 時一樣。
大家可以看到 main
函式是沒有任何的參數的,我們接下來就學習如何編寫帶參數的、回傳 0 個或多個值的函式。
第六行,我們呼叫了 fmt
套件裡面定義的函式 Printf
。大家可以看到,這個函式是透過 <pkgName>.<funcName>
的方式呼叫的,這一點和 Python 十分相似。
前面提到過,套件名和套件所在的資料夾名可以是不同的,此處的
<pkgName>
即為透過package <pkgName>
宣告的套件名,而非資料夾名。
最後大家可以看到我們輸出的內容裡面包含了很多非 ASCII 碼字元。實際上,Go 是天生支援 UTF-8 的,任何字元都可以直接輸出,你甚至可以用 UTF-8 中的任何字元作為識別符號。
Go 使用 package
(和 Python 的模組類似)來組織程式碼。main.main()
函式(這個函式位於主套件)是每一個獨立的可執行程式的入口點。Go 使用 UTF-8 字串和識別符號(因為 UTF-8 的發明者也就是 Go 的發明者之一),所以它天生支援多語言。