# 變數與常數 ## 變數 使用 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 ) ```