---
# System prepended metadata

title: 來學點 Go !
tags: [Go]

---

# 來學點 Go !

###### tags: `Go`

### 前情提要

 * 資料參考
     > [初學 Golang 30 天](https://ithelp.ithome.com.tw/articles/10155678)

 * 分點章節
     > [來學點 Go !](/PHSJz1oER0S1Z4COWM0eyA)
     > [來學點 Go !!](/V39Yd1B1RK-fUjAYEyJJLQ)

### 環境安裝

 * 作業系統： Ubuntu 18.04 
 * 官網安裝頁 [Link](https://golang.org/doc/install)
 * 環境變數
     ```shell
     $ export PATH=$PATH:/usr/local/go/bin
     ```
 * 測試環境
      ```shell
     $ go version
     
     go version go1.17.1 linux/amd64
     ```
### Hello World.go

 * 嘗試編寫第一個程式 hello.go
    ```go
    package main

    import "fmt"

    func main() {
        fmt.Println("Hello, World")
        fmt.Println("哈囉！世界！")
    }
     ```
 * 嘗試執行它
    ```shell
    $ go run hello.go
    
    Hello, World
    哈囉！世界！
    ```
    
### 想說點什麼宣告 (var)
    
 * 基礎宣告
     ```go
     var x int
     ```
 * 宣告並給予初始值
     ```go
     var x int = 10
     ```
 * 宣告多個變數
     ```go
     var x int, y string
     var x, y, z int = 1, 2, 3
     ```
 * 簡短宣告
     ```go
     x := 10
     x, y, z := 10, true, "10"
     ```
     
 * 宣告陣列
    ```go
    // 基礎
    var x [1]int
    x[0] = 0
    fmt.Println(x)
    /**
     * 印出結果
     * [0]
     */
    
	// 賦值
	y := []float64{1, 2, 3, 4, 5}
	fmt.Println(y)
    /**
     * 印出結果
     * [1 2 3 4 5]
     */
    ```
     
 * 程式範例 [Link](https://play.golang.org/p/yfKs5dfv8dQ)
    ```go
    package main

    import (
        "fmt"
    )
    
    /**
     * echo x:(int)1, y:(bool)true, z:(string)3
     */
    func main() {
        x, y, z := 1, true, "3"
        fmt.Printf("x:(%T)%v, y:(%T)%v, z:(%T)%v\n", x, x, y, y, z, z)
    }
    ```
    
### 轉點什麼迴圈 (for)
    
 * For 
    ```go
    // 範例1: 一般的for
	sum := 0
	for i := 0; i < 5; i++ {
		// 做點你想在迴圈內做的, ex: 數字加個N次
		sum++
		fmt.Printf("for(%d) sum => %d\n", i, sum)
        /**
         * 印出結果
         * for(0) sum => 1
         * for(1) sum => 2
         * for(2) sum => 3
         * for(3) sum => 4
         * for(4) sum => 5
         */
	}
    
    // 範例2: 像是 while 的 for
	for sum > 1 {
		fmt.Println(`sum =>`, sum)
		sum--
	}
	fmt.Println(`sum =>`, sum)
    /**
     * 印出結果
     * sum => 5
     * sum => 4
     * sum => 3
     * sum => 2
     * sum => 1
     */
    
    // 範例3: 無窮的 for
	for {
		sum++
		if sum >= 5 {
			fmt.Println(`sum =>`, sum, `break for`)
			break
		}
		fmt.Println(`sum =>`, sum)
	}
    /**
     * 印出結果
     * sum => 2
     * sum => 3
     * sum => 4
     * sum => 5 break for
     */
    ```
    
### 來點變化的匹配 (map)

 * 有 string key 的陣列
    ```go
    users := map[int]string {
        0: "A1",
        1: "B2",
        2: "C3",
        // 注意最後一個元素需要保留,
        4: "E5",
    }
    fmt.Print(users, "\n")
    /**
     * 印出結果
     * map[0:A1 1:B2 2:C3 4:E5]
     */
    ```