[TOC]
## 變量聲明
- 使用var關鍵字
> var 變量名 變量類型 = [變量值]
```
//定義多個變量
var vname1,vname2,vname3 type
//定義變量,并初始化
var vname1 int = 1
//同時初始化多個變量
var vname1,vname2,vname3 = v1,v2,v3
```
- 使用 :=
```
//定義變量,并初始化
vname1 := 1
//同時初始化多個變量
vname1,vname2,vname3 := v1,v2,v3
// 示例: var a, b, c = 3, 4, "foo"
```
- 分組聲明
在Go語言中,同時聲明多個常量、變量,或者導入多個包時,可采用分組的方式進行聲明
```
// 同時導入多個包
import (
"fmt"
"errors"
)
// 聲明多個常量
const (
i = 100,
pi = 3.14
prex = "Go_"
)
// 聲明多個變量
var (
a int,
b string = "hello",
)
```
- 特殊變量: _(下劃線)
`任何賦予它的值都會被丟棄,Go語言對于已聲明但未使用的變量會在編譯階段報錯,可以通過其來丟棄`
```
_, b := 1,2
```
## 基礎類型
### 整數
整數類型有無符號和帶符號兩種。Go語言同時支持int和uint,這兩種類型的長度相同,但具體長度取決于不同編譯器的實現。當前的gcc和gccgo編譯器在32位和64位平臺上都使用32位來表示int和uint,但未來在64位平臺上可能增加到64位。Go語言里面也有直接定義好位數的類型:rune,int8,int16,int32,int64和byte,uint8,uint16,uint32,uint64。`其中rune是int32的別稱,byte是uint8的別稱`
### 浮點數
浮點類型有float32 和 浮點類型有float64 兩種,默認是float64
### 復數
默認類型是complex128(64位實數+64位虛數)。如果需要小一些的,也有complex64(32位實數+32位虛數)。復數的形式為RE+IMi,其中RE是實數部分,IM是虛數部分,而最后的i是虛數單位
```
var c complex64 = 5 + 5i
```
### 布爾類型
布爾值的類型為bool,值是true或false,默認為false
### 字符串
字符串都是采用UTF-8字符集編碼。字符串是用一對雙引號("")或反引號(` `)括起來定義,`字符串不可變,可以用 + 操作符 連接兩個字符串`
```
// 單行字符串
s := "hello word"
// 多行字符串
s := `這是一個段落,
此處的換行會原樣輸出。
`
```
### 錯誤類型
Go語言內置有一個error類型,專門用來處理錯誤信息,Go語言的package里面還專門有一個包errors來處理錯誤
```
err := errors.New("error:我自己定義的錯誤")
if err != nil {
fmt.Print(err)
}
```
### 常量
程序編譯階段就確定下來的值,而程序在運行時則無法改變該值。在Go語言程序中,常量可定義為數值、布爾值或字符串等類型。
語法:
> const 常量名 [常量類型] = 常量值
```
const PI float32 = 3.1415
const a = 100
const Prex = "Go_"
```
## 復合類型
### 數組
```
語法: var 數組變量名 [數組長度]T
說明:
● 數組變量名:數組聲明及使用時的變量名。
● 元素數量:數組的元素數量。
可以是一個表達式,但最終通過編譯期計算的結果必須是整型數值。
也就是說,元素數量不能含有到運行時才能確認大小的數值。
● T可以是任意基本類型,包括T為數組本身。但類型為數組本身時,可以實現多維數組
示例:
var arr [3]int //默認初始化0
var q [3]int = [3]int{1,2,3}
q := [...]int{1,2,3}
q := [...]int{90:-1}//key和value的賦值方式,下表90的值為-1,數組長度為91
```
> 如果在 `數組的長度` 位置出現的是“...”省略號,則表示數組的長度是根據初始化值的 個數來計算
### 切片
創建slice主要兩種:1.基于數組創建。2.直接創建
- 1.基礎數組創建
```
arrVar := [4]int{1, 2, 3,4}
sliceVar := arrVar[1:3]
```
> 數組arrVar和sliceVar里面的地址其實是一樣的,也就是說如果你改變sliceVar里面的變量,那么arrVar里面的變量也會隨之改變。
- 2.直接創建
```
myslice1 := make([]int,5)//創建一個元素個數5的slice,cap也是5
myslice2 := make([]int,5,10)//創建一個元素個數5的slice,cap是10
myslice3 := []int{1,2,3,4}//創建一個元素個數為4的slice,cap是4
var slice []int //創建一個空的slice,cap和len都是0
```
> 可以使用內置的make()函數來創建。事實上還是會創建一個匿名的數組,只是不需要我們來定義。
### map
可以使用內建函數 make 也可以使用 map 關鍵字來定義 Map:
```
/* 聲明變量,默認 map 是 nil */
var myMap map[keyType]valueType
//示例1
ages := map[string] int {
"tom": 21,
"anny": 18,
}
/* 使用 make 函數 */
myMap := make(map[keyType]valueType)
//示例1相當于
ages := make(map[string]int)
ages["tom"] = 21
ages["anny"] = 18
```
> myMap是聲明的變量名,keyType是對應的Key的類型,valueType是value的類型。
### 結構體
> 結構體是一種聚合的數據類型,是由零個或多個任意類型的值聚合成的實體。每個值稱為結構體的成員。
```
/* 聲明結構體 */
type 結構體名稱 struct {
屬性1 類型
屬性2 類型
...
}
/* 使用示例 */
type User struct {
name string
age int
}
user := new(User)
user.name = "tom"
user.age = 20
```
<font color='red'>字段直接沒有逗號,</font>
> 結構體的初始化可以使用new關鍵詞和var關鍵詞,不同的是如果使用new,則返回類型是一個指針,使用var,則是結構體自身。