# 變數與常數
## 變數
使用 var 關鍵字是Go最基本的變數宣告方式:
```go=
//將型別放在變數名稱後方
var name string
var age int
var enable bool
```
在變數名稱後加上變數型別,若無賦值(初始化)則變數會被初始化成其型別的預設值。
:::success
整型和浮點型變數的預設值為 `0`
字串變數的預設值為空字串 `""`
布林型變數預設為 `false`
切片、函式、指標變數的預設為 `nil`
:::
要注意的是變數名稱、型別…等都是 **有區分大小寫** 的。
```go=
//型態區分大小寫
var name String //Wrong
var name string
var age Int //wrong
var age int
//變數名稱區分大小寫
var Computer = "大寫C"
var computer = "小寫c"
fmt.Println(Computer,computer) //大寫C 小寫c
```
### 變數命名及使用規則
1.變數名稱首字符**不能**為數字,可以是字母或者下划線(_):
```Go
_myName
_temp
iPad
applePencil
a_123
2021 // wrong
4abc // wrong
```
2.Go語言中關鍵字和保留字都**不能**作變數名,也**不能**帶有運算符(+,-,*,/…)
關鍵字即是被Go語言賦予特殊涵義的單字,也可稱為保留字。Go語言中的關鍵字共有25個:

3.Go 語言中的變數需要宣告後才能使用,並且**宣告後必須使用**。
### 初始化
#### 指定資料型別
```go=
var name string = "小明"
var age int = 18
```
:::warning
注意:字串必須使用“雙引號”,‘單引號’ 會報錯
:::
#### 根據值判斷型別
Go 還可以根據你賦予的初值來判斷該變數為何種型別,因此也能這麼寫:
```go=
var name,address,email = "小明","台北市","a123@gmail.com"
fmt.Println(name) //印出變數值 小明
fmt.Println(name,address,email) //多個變數印出 小明 台北市 a123@gmail.com
```
#### 使用 :=
使用 `:=` 省略掉 var 並初始化變數,要注意的是 `:=` 左側必須為新定義的變數
```go=
name, address, email := "小明", "台北市", "a123@gmail.com"
fmt.Println(name,address,email) //小明 台北市 a123@gmail.com
```
像是下方這個例子會引發編譯錯誤:
```go=
var age int
age := 21 //編譯錯誤 age已經定義不需重新定義
```
:::danger
只能在函數體內使用 `:=` 宣告變數,不可用於全局變數的宣告與賦值。
:::
## 常數
常數為在程式編譯階段就確定下來的值,而程式在執行時無法改變該值。
常數可定義為數值、布林值或字串等型別。
```go=
const Pi = 3.1415926
const Size = 50
const prefix = "Pluto_"
Size = 20 // 當你試著去修改常數的值,會引發 cannot assign to Size 錯誤
```
### iota
自增長常數,在`const{}`添加一個關鍵字 iota ,每行的iota都會累加1,第一行iota默認為0
```go=
const(
Taipei = iota
Taoyuan
Taichung
Kaohsiung
Tainan
)
fmt.Println(Taipei) //0
fmt.Println(Taoyuan) //1
fmt.Println(Taichung) //2
fmt.Println(Kaohsiung) //3
fmt.Println(Tainan) //4
```
iota可以定義數量級(ex: KB,MB,GB,TB…等類似的單位也可以用此來定義)
```go=
const(
Taipei = iota*10
Taoyuan
Taichung
Kaohsiung
Tainan
)
fmt.Println(Taipei) //0
fmt.Println(Taoyuan) //10
fmt.Println(Taichung) //20
fmt.Println(Kaohsiung) //30
fmt.Println(Tainan) //40
```
複雜一點的話
```go=
const(
a,b = iota+1,iota+2 // iota = 0 , a = 0+1 = 1 , b = 0+2 = 2
c,d // iota = 1 , c = 1+1 = 2 , d = 1+2 = 3
e,f // iota = 2 , e = 2+1 = 3 , f = 2+2 = 4
g,h = iota*2,iota*3 //iota = 3 , g = 3*2 = 6 , h = 3*3 = 9
i,j //iota = 4 , i = 4*2 = 8 , j = 4*3 = 12
)
fmt.Println("a = %d , b = %d",a,b) // a = 1 , b = 2
fmt.Println("c = %d , d = %d",c,d) // c = 2 , d = 3
fmt.Println("e = %d , f = %d",e,f) // e = 3 , f = 4
fmt.Println("g = %d , h = %d",g,h) // g = 6 , h = 9
fmt.Println("i = %d , j = %d",i,j) // i = 8 , j = 12
```
## 分組宣告
同時宣告多個變數、常數或匯入多個套件時都可以採用分組的方式進行宣告。
### 匯入多組套件
```go=
import "fmt"
import "os"
```
可寫為:
```go=
import(
"fmt"
"os"
)
```
### 宣告多個常數
```go=
const Pi = 3.1415926
const Size = 50
const prefix = "Pluto_"
```
可寫為:
```go=
const(
Pi = 3.1415926
Size = 50
prefix = "Pluto_"
)
```
### 宣告多個變數
```go=
var i int
var pi float32
var enable bool
```
可寫為
```go=
var(
i int
pi float32
enable bool
)
```