---
# System prepended metadata

title: Golang Learning Journey
tags: [Go]

---

> 因為最近很努力在學習terraform，然後golang好像很熱門又好用，所以開始我的學習之旅，這邊是 Part 1.

# Introduction
> 這邊我就列幾點 golang的特色吧！
1. Go語言的原本名稱為Go language，因此又稱golang。
2. Go是由Google開發的一個靜態編譯程式語言，支援垃圾回收與併發。
3. 可以編譯為原生機器碼，執行速度快，且內建垃圾回收機制（GC）。
4. 支援 Windows、macOS、Linux 等多種作業系統
5. 內建 goroutine（輕量級線程）和 channel，方便撰寫高效能的並行程序。

# 典型使用場景
> Go 特別適合撰寫高效能的 Web API 和微服務架構。由於語言原生支持並行處理，能輕鬆處理大量連線和請求。
## 網路服務與後端開發
> Go 特別適合撰寫高效能的 Web API 和微服務架構。由於語言原生支持並行處理，能輕鬆處理大量連線和請求。
- Docker
- Kubernetes
- 大型後端服務

## 分散式系統與雲端基礎架構
> Go 在雲端與容器生態系發展迅速，很多基礎架構工具都使用 Go 開發，原因是它的效能與易部署性。
- Terraform
- Prometheus
- Etcd（分散式鍵值儲存）

## 命令列工具與自動化
> Go 的編譯產出是單一二進位檔，非常方便發佈與使用，適合開發 CLI 工具或自動化腳本。
- Hugo（靜態網站產生器）
- Cobra（建立 CLI 工具的框架）


# Installation
1. Find the proper package for your device.
    {%preview https://go.dev/doc/install %}

2. Checkout your go version after installation
    ```bash
    go version
    ```

# 範例程式碼
## Create a file named `main.go`
```go=
package main

import "fmt"
func main(){
	fmt.Print("Hello, World!")
}
```
## Execute the file.
```bash
go run main.go
```
You should see this result:
![image](https://hackmd.io/_uploads/BkKMxHs-ll.png)

## 範例程式碼逐行解釋
```go
package main
```
- 這行定義了這個程式所在的「套件」（package）名稱叫做 main。
- main 是特殊的套件名稱，代表這是一個可執行程式（executable program），**執行時會從 main 函式開始執行**。

```go
import "fmt"
```
- 這行是匯入Go 的標準函式庫 fmt（format），這個函式庫很常用。
- fmt 提供輸入輸出功能，例如印出文字到終端機。

```go
func main(){
```
- 宣告一個名為 main 的函式，是程式的進入點，因為前面的package宣告ｍain。
- 執行 Go 程式時，系統會從 main.main() 函式開始執行。

```go
fmt.Print("Hello, World!")
```
- 呼叫 fmt 套件的 Print 函式，把字串 "Hello, World!" 輸出到終端機。
- Print 不會自動換行，所以文字後面沒有換行符號。

```go
}
```
- 結束 main 函式的區塊。


# 套件（Package)
> 有沒有很疑惑套件是什麼呢？
- Package 是 Go 程式碼組織的最小單位，一個 package 內包含一組相關的程式檔案（.go），共同完成某個功能或一組功能。
- 每個 Go 程式檔案的最上方都必須宣告 package 名稱。
- Package 幫助將程式碼模組化與封裝，讓不同功能可以分開管理與重複使用，可以透過 import 引入其他 package 使用其功能。
- 控制程式碼的可見性（包內可見、包外不可見）。

## 簡單的範例
```go=
// hello.go
package greeting

func SayHello() string {
    return "Hello, Go!"
}
```
```go=
import "your_module_path/greeting"

func main() {
    fmt.Println(greeting.SayHello())
}
```

# 如何編譯成執行檔
```bash
go build hello.go
```
- Go 會將 hello.go 原始碼檔案編譯成一個執行檔，名稱為 hello（在 Linux 或 macOS 上）或 hello.exe（在 Windows 上），並且會放在目前的目錄中。
- 這個執行檔是獨立的二進位檔，也就是說它包含了所有必要的程式碼和依賴，可以獨立執行，不需要在該機器上安裝 Go 環境。
- 編譯完成後，你可以透過輸入以下指令來執行它：
    ```bash
    ./hello
    ```
