# 來學點 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]
*/
```