---
# System prepended metadata

title: 變數與常數

---

# 變數與常數

## 變數

使用 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個：

![](https://i.imgur.com/OkJOzCy.png)

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
)
```