[TOC]
## 變量聲明
變量聲明以關鍵字`var`開頭,變量類型放在變量的后面,行尾無需分號
~~~
var 變量名 變量類型
~~~
eg:
~~~
var name string
~~~
## 批量聲明
每聲明一個變量就需要寫`var`關鍵字會比較繁瑣,go語言中還支持批量變量聲明:
~~~
var (
name string
age int
is_beauty bool
height float64
)
~~~
## 變量的初始化
Go語言在聲明變量的時候,會自動對變量對應的內存區域進行初始化操作。每個變量會被初始化成其類型的默認值;
例如:
整型和浮點型變量的默認值為`0`;
字符串變量的默認值為`空字符串`;
布爾型變量默認為`false`;
切片、函數、指針變量的默認為`nil`
在聲明變量的時候為其指定初始值。變量初始化的標準格式如下:
~~~
var 變量名 類型 = 表達式
~~~
eg:
~~~
var name string = "叫我小叮當啊"
~~~
一次初始化多個變量
~~~
var name, age = "叫我小叮當啊", 18
~~~
### 類型推導
有時候可以將變量的 類型 省略,這個時候編譯器會根據等號右邊的值來推導變量的類型完成初始化。
~~~
var name = "叫我小叮當啊"
var age = 18
~~~
### 短變量聲明
在函數內部,可以使用更簡略的`:=`方式聲明并初始化變量。
~~~
package main
import (
"fmt"
)
// 全局變量xdd
var xdd = 1
func main() {
dx := 10
xdd1 := 200 // 局部變量xdd
fmt.Println(xdd, dx , xdd1)//1?10?200
}
~~~
### 匿名變量
在使用多重賦值時,如果想要忽略某個值,可以使用`匿名變量(anonymous variable)`。 匿名變量用一個下劃線`_`表示
~~~
package?main
import?(
"fmt"
)
funcxdd()?(string,?int)?{
return "叫我小叮當啊",?18
}
funcmain()?{
name,?_?:=?xdd()
_,?age?:=?xdd()
????fmt.Println(name,?age)
}
~~~
匿名變量不占用命名空間,不會分配內存,所以匿名變量之間不存在重復聲明。
注意事項:
1. 函數外的每個語句都必須以關鍵字開始(var、const、func等)
2. `:=` 要在函數內部使用,不能使用在函數外。
3. `_`多用于占位,表示忽略值
## 常量
相對于變量,常量是恒定不變的值,多用于定義程序運行期間不會改變的那些值。 常量的聲明和變量聲明非常類似,只是把`var`換成了`const`,常量在定義的時候必須賦值。
只聲明一個:
~~~
const pi = 3.1415
~~~
同時聲明多個:
~~~
const (
pi = 3.1415
e = 2.7182
)
~~~
const同時聲明多個常量時,如果省略了值則表示和上面一行的值相同。 eg:
~~~
const (
x1 = 100
d2
d3
)
~~~
上面示例中,常量`x1`、`d2`、`d3`的值都是100。
## iota
1.在const關鍵字出現時將被重置為0
2.每新增一行常量聲明將使`iota`計數一次
使用iota能簡化定義,在`定義枚舉`時很有用。
~~~
const (
n1 = iota //0
n2 //1
n3 //2
n4 //3
)
~~~
eg:
使用`_`跳過某些值
~~~
const (
n1 = iota //0
n2 //1
_
n4 //3
)
~~~
`iota`聲明中間插隊
~~~
const (
n1 = iota //0
n2 = 100 //100
n3 = iota //2
n4 //3
)
const n5 = iota //0
~~~
多個`iota`定義在一行
~~~
const (
a, b = iota + 1, iota + 2 //1,2
c, d //2,3
e, f //3,4
)
~~~
解答:
1.const同時聲明多個常量時,如果省略了值則表示和上面一行的值相同
2.每新增一行常量聲明將使`iota`計數一次
3.由于沒有顯式的常量初始化表達式,根據const聲明塊的“隱式重復前一個非空表達式”機制
以上三點就可以解釋c、d、e、f 的值
## 值類型和引用類型
值類型:int、float、bool 和 string等;
即`這些類型的變量直接指向存在內存中的值`
當使用等號`=`將一個變量的值賦值給另一個變量時,
eg:`j = i`,實際上是在內存中將 i 的值進行了拷貝
引用類型:特指slice、map、channel這三種預定義類型
兩者的主要區別:拷貝操作和函數傳參。
- Go準備工作
- 依賴管理
- Go基礎
- 1、變量和常量
- 2、基本數據類型
- 3、運算符
- 4、流程控制
- 5、數組
- 數組聲明和初始化
- 遍歷
- 數組是值類型
- 6、切片
- 定義
- slice其他內容
- 7、map
- 8、函數
- 函數基礎
- 函數進階
- 9、指針
- 10、結構體
- 類型別名和自定義類型
- 結構體
- 11、接口
- 12、反射
- 13、并發
- 14、網絡編程
- 15、單元測試
- Go常用庫/包
- Context
- time
- strings/strconv
- file
- http
- Go常用第三方包
- Go優化
- Go問題排查
- Go框架
- 基礎知識點的思考
- 面試題
- 八股文
- 操作系統
- 整理一份資料
- interface
- array
- slice
- map
- MUTEX
- RWMUTEX
- Channel
- waitGroup
- context
- reflect
- gc
- GMP和CSP
- Select
- Docker
- 基本命令
- dockerfile
- docker-compose
- rpc和grpc
- consul和etcd
- ETCD
- consul
- gin
- 一些小點
- 樹
- K8s
- ES
- pprof
- mycat
- nginx
- 整理后的面試題
- 基礎
- Map
- Chan
- GC
- GMP
- 并發
- 內存
- 算法
- docker