> For the complete documentation index, see [llms.txt](https://willh.gitbook.io/build-web-application-with-golang-zhtw/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://willh.gitbook.io/build-web-application-with-golang-zhtw/02.0/02.1.md).

# 你好，Go

在開始編寫應用之前，我們先從最基本的程式開始。就像你造房子之前不知道什麼是地基一樣，編寫程式也不知道如何開始。因此，在本節中，我們要學習用最基本的語法讓 Go 程式執行起來。

## 程式

這就像一個傳統，在學習大部分語言之前，你先學會如何編寫一個可以輸出`hello world`的程式。

準備好了嗎？Let's Go!

```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 的發明者之一)，所以它天生支援多語言。

## links

* [目錄](https://github.com/doggy8088/build-web-application-with-golang-zhtw/tree/4cbbaa31bdfc3678915eb91f23db2f1bad554a20/preface.md)
* 上一節: [Go 語言基礎](/build-web-application-with-golang-zhtw/02.0.md)
* 下一節: [Go 基礎](/build-web-application-with-golang-zhtw/02.0/02.2.md)
