前言
前面單元我們介紹了如何建置 Go 開發環境,接下來的單元我們將透過 Golang Web 程式設計來學習 Go 這個程式語言。而在這個單元中我們將介紹 Go 的變數和常數宣告以及資料型別的使用。程式語言唯有動手作才能學的好,你可以參考之前的文章建置開發環境或是使用線上開發環境進行學習。
定義變數和使用
變數是程式語言中暫存資料的盒子,在 Go 中比較特別的是定義變數有多種方式(特別的是 Go 語言和 C 語言在設計上比較不同的地方是 Go 語言把變數型別宣告放在變數名稱後面),以下列出比較常見的變數使用方式:
一般變數宣告
1
2// var 關鍵字 變數名稱 資料型別
var varName type範例:
1
var str string
定義多個變數
1
var var1Name, varName2 type
範例:
1
var str1, str2 string
定義變數並初始化
1
var varName type = value
同時初始化多個變數
1
var varName1, varName2, varName3 type = v1, v2, v3
簡化宣告
1
var varName1. varName2, varName3 = v1, v2, v3
另外一種是使用
:=
符號取代var
和type
,但要注意的是這樣的方式只能在函式內部使用,若是在全域使用會出現編譯錯誤,一般使用var
定義全域變數。它的變數生命週期為block
內。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28package main
import "fmt"
var num = 10
// 編譯錯誤
str0 := "world"
func main() {
var str1 = "hello"
str2 := "world"
fmt.Println(num)
fmt.Println(str1)
fmt.Println(str2)
if true {
var str3 = "XD" // str3 := "XD"
fmt.Println(num)
fmt.Println(str1)
fmt.Println(str2)
fmt.Println(str3)
}
fmt.Println(num)
fmt.Println(str1)
fmt.Println(str2)
// 變數生命週期結束 undefined 錯誤
fmt.Println(str3)
}值得注意的若是在函式內宣告但沒使用會出現編譯錯誤:
1
2
3
4
5
6
7
8
9
10package main
import "fmt"
var num = 10
func main() {
var str = "hello"
fmt.Println(str)
}1
./main.go:10:6: str declared and not used
定義常數
常數和變數不同是在編譯時就確認值,在程式執行期間不可以更改值。在 Go 程式語言使用 const
定義常數,其語法如下:
1 | const constName = value |
內建簡單資料型別
布林值
在 Go 布林值是true
或false
,預設為false
。1
var isActived = true
數字
在 Go 語言中主要分為int
和uint
兩類型數字資料型別,個別之間還有位元可以做選擇,例如:int32
。注意兩種數字資料型別不能互相設定或操作(例如:相加)1
var num = 12
字串
Go 語言中使用 UTF-8 字元編碼,使用""
來包裹字串:1
2
3
4
5
6
7var str string = "hello"
str[1] // e
ch = []byte(str)
ch[1] = 'w'
str2 = string(ch)
fmt.Println(str2) // hwllo錯誤類型
在 Go 語言中有一個error
類型,在套件中也有個errors
負責處理錯誤訊息:1
2
3
4
5
6import errors
err := errors.New("throw error")
if err != nil {
fmt.Println(err)
}
複雜資料型別
array
array 就是一般程式語言的陣列,基本上和其他程式語言相同:1
2// 變數名稱 [長度]類別
var arrayName [n]type陣列長度宣告後不能改變,傳入函式為副本,若需要傳指標進去可以使用
slice
。實際使用方式:1
2
3
4
5
6
7
8
9
10
11// 宣告長度為 10 類型為 int 的陣列
var arr [10]int
arr[0] = 7
arr[1] = 13
a := [3]int{1, 2, 3}
b := [10]int{1, 2, 3}
// 自動計算元素長度
c := [...]int{1, 2, 3}
// 二維陣列
dArry := [2][4]{[3]{1, 2, 3}, [3]{2, 3, 4}}slice
有時候我們不會一開始就知道需要宣告多長的陣列,這時就需要使用動態陣列(是一個參考類型,總是指向底層 array):slice,其使用方式:1
var sliceName = []type
實際使用:
1
2
3slice = []byte{1, 3, 4}
array = [3]int{1, 3, 4}
bySlice :=map
map 和其他程式語言的 dict 和 hash map 相似,使用方式:1
var mapName = map[keyType]valueType
key 可以是除了 int 外其他類型,取值使用 key 取值:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18// 第一種宣告方式
var numbers map[string] int
// 第二種宣告方式
numbers := make(map[string]int)
numbers["one"] = 1
numbers["two"] = 7
numbers["three"] = 13
fmt.Println("three", numbers["three"])
// key 數量
m := map[string]int {"1": 1, "3": 2}
fmt.Println(len(m))
// map 新增、刪除、修改、查找
numbers["three"] = 13
value, ok := numbers["three"]
numbers["three"] = 17
delete(numbers["three"])此外 map 是無序的,也是個參考類型指到底層:
1
2
3
4
5
6numbers := make(map[string]int)
numbers["three"] = 13
numbers2 := numbers
numbers2["three"] = 1 // numbers["three"] 也變成 1
make、new 比較
make 一般用於內建資料型別(map、slice 和 channel)的記憶體分配,而 new 用於各種類型記憶體分配。make 回傳有初值的 T 類型,而 new 回傳指標。
總結
以上就是關於 Go 程式語言的基本語法中的變數和資料型別介紹,接下來的文章我們將透過 Golang Web 程式設計來學習 Go 這個程式語言的方方面面。
參考文件
- A tour of go
- Go Tutorial
- Go by Example
- Go Programming Language: An Introductory Tutorial
- Go tour Exercise
- Ubuntu Go install
- 從Go看現代程式語言
(image via cuelogic)