隨筆(一些需要注意的小細(xì)節(jié))
int類型是一個特殊的類型,在64位電腦上占8個字節(jié),在32位電腦上占4個字節(jié)
基本數(shù)據(jù)類型
布爾類型
- 布爾類型數(shù)據(jù)與整型數(shù)據(jù)不能進(jìn)行交換
- 聲明的布爾類型默認(rèn)為<font color=red>false</font>
浮點型
- 浮點數(shù)字面量被自動類型推斷為<font color=red>float64</font>類型
- 兩個浮點數(shù)之間不應(yīng)該使用==或!=進(jìn)行比較操作,應(yīng)該使用math標(biāo)準(zhǔn)庫
復(fù)數(shù)類型
- 復(fù)數(shù)類型有兩種:complex64和complex128,復(fù)數(shù)在計算機(jī)中由兩個浮點數(shù)表示,一個實部一個虛部
- complex64:兩個float32組成
- complex128:兩個float64構(gòu)成
- 三個內(nèi)置函數(shù):
- complex():構(gòu)造一個復(fù)數(shù)
- real():返回一個復(fù)數(shù)實部
- image():返回復(fù)數(shù)虛部
字符串
- 字符串是常量,可以直接通過索引訪問其字節(jié)單位,但是不能修改
- 字符串尾部<font color=red>不包含NULL字符</font>
-
基于字符串創(chuàng)建的切片和原字符串指向相同的底層字符數(shù)組,一樣不能修改,對字符串的切片操作返回的子串仍是string,而非slice
go語言隨筆picture1.png
rune類型
- Go內(nèi)置兩種字符類型:
- 一種是byte的字節(jié)類類型(byte是uint的別名)
- 一種是Unicode編碼的字符rune(rune是int32的別名,占用四個字節(jié))
- Go語言默認(rèn)的字符編碼就是UTF-8類型的,如果需要特殊的編碼轉(zhuǎn)換,則使用Unicode/UTF-8標(biāo)準(zhǔn)包
指針
- Go語言支持多級指針**T
- Go不支持指針運算
- 函數(shù)中允許返回局部變量的地址
- Go編譯器使用<font color=red>棧逃逸</font>機(jī)制將這種局部變量的空間分配在堆上
func sum(a,b int) *int{ sum := a + b return &sum //sum將分配在堆上 }
- Go編譯器使用<font color=red>棧逃逸</font>機(jī)制將這種局部變量的空間分配在堆上
切片

go語言隨筆picture2.png
-
切片支持的操作
- 內(nèi)置函數(shù)len()返回切片長度
- 內(nèi)置函數(shù)cap()返回切片底層數(shù)組容量
- 內(nèi)置函數(shù)append()對切片追加元素
- 內(nèi)置函數(shù)copy()用于復(fù)制一個切片
-
切片:
為什么用切片:
1. 數(shù)組的容量固定,不能自動拓展。 2. 值傳遞。 數(shù)組作為函數(shù)參數(shù)時,將整個數(shù)組值拷貝一份給形參。 在Go語言當(dāng),我們幾乎可以在所有的場景中,使用 切片替換數(shù)組使用。切片的本質(zhì):
不是一個數(shù)組的指針,是一種數(shù)據(jù)結(jié)構(gòu)體,用來操作數(shù)組內(nèi)部元素。 runtime/slice.go type slice struct { *p len切片的使用: cap
}
數(shù)組和切片定義區(qū)別:創(chuàng)建數(shù)組時 [ ] 指定數(shù)組長度。 創(chuàng)建切片時, [] 為空,或者 ... 切片名稱 [ low : high : max ] low: 起始下標(biāo)位置 high:結(jié)束下標(biāo)位置 len = high - low 容量:cap = max - low 截取數(shù)組,初始化 切片時,沒有指定切片容量時, 切片容量跟隨原數(shù)組(切片)。 s[:high:max] : 從 0 開始,到 high結(jié)束。(不包含) s[low:] : 從low 開始,到 末尾 s[: high]: 從 0 開始,到 high結(jié)束。容量跟隨原先容量?!境S谩?切片創(chuàng)建:
1. 自動推導(dǎo)類型創(chuàng)建 切片。slice := []int {1, 2, 4, 6} 2. slice := make([]int, 長度,容量) 3. slice := make([]int, 長度) 創(chuàng)建切片時,沒有指定容量, 容量== 長度?!境S谩?切片做函數(shù)參數(shù) —— 傳引用。(傳地址)
append:在切片末尾追加元素
append(切片對象, 待追加元素) 向切片增加元素時,切片的容量會自動增長。1024 以下時,一兩倍方式增長。copy:
copy(目標(biāo)位置切片, 源切片) 拷貝過程中,直接對應(yīng)位置拷貝。 -
map:
字典、映射 key —— value key: 唯一、無序。 不能是引用類型數(shù)據(jù)。
map 不能使用 cap()創(chuàng)建方式:
1. var m1 map[int]string --- 不能存儲數(shù)據(jù)2. m2 := map[int]string{} ---能存儲數(shù)據(jù) 3. m3 := make(map[int]string) ---默認(rèn)len = 0 4. m4 := make(map[int]string, 10)初始化:
1. var m map[int]string = map[int]string{ 1: "aaa", 2:"bbb"} 保證key彼此不重復(fù)。 2. m := map[int]string{ 1: "aaa", 2:"bbb"}賦值:
賦值過程中,如果新map元素的key與原map元素key 相同 ——> 覆蓋(替換) 賦值過程中,如果新map元素的key與原map元素key 不同 ——> 添加map的使用:
遍歷map: for key值, value值 := range map { } for key值 := range map { } 判斷map中key是否存在。 map[下標(biāo)] 運算:返回兩個值, 第一個表 value 的值,如果value不存在。 nil 第二個表 key是否存在的bool類型。存在 true, 不存在false刪除map:
delete()函數(shù): 參1: 待刪除元素的map 參2: key值 delete(map, key) 刪除一個不存在的key , 不會報錯。 map 做函數(shù)參數(shù)和返回值,傳引用。
Switch
- 在switch中加入了一個<font color=red>fallthough</font>關(guān)鍵字,強制執(zhí)行下一個case語句,不在判斷下一個case子句的條件是否成立
- switch后面可以加入一個初始化語句,用分號隔開
switch i := "y"; i{ case "y": ··· }
函數(shù)
- 首字母大小寫決定該函數(shù)在其他包是否可見:大寫時其他包可見,小寫時只有相同包可以訪問
- 不支持默認(rèn)值參數(shù)
- 不支持函數(shù)重載
- 不支持函數(shù)嵌套(除匿名函數(shù)外)
延遲調(diào)用函數(shù)---defer
- defer后面必須是函數(shù)或方法的調(diào)用
- defer函數(shù)的實參在注冊時通過值拷貝傳遞進(jìn)去
- defer函數(shù)的調(diào)用<font color=red>先進(jìn)后出</font>
panic和recover
- panic用來主動拋出錯誤,recover用來捕獲panic拋出的錯誤
panic(i interface{})
recover() interface{}
- panic的參數(shù)是一個空接口類型interface{},所以任意類型的變量都可以傳遞給panic
- 發(fā)生panic后,程序就會從調(diào)用panic的函數(shù)位置或者發(fā)生panic的地方立即返回,逐層向上執(zhí)行函數(shù)的defer語句,然后逐層打印函數(shù)調(diào)用堆棧,直到recover捕獲或運行到最外層函數(shù)而退出
- recover()用來捕獲panic,阻止panic繼續(xù)向上傳遞。
- recover和defer一起使用,但是recover只有在defer后面的函數(shù)體內(nèi)才能被直接調(diào)用才能捕獲panic終止異常,否則返回nil,異常繼續(xù)向外傳遞
//這個會捕獲失敗
defer recover()
//這個才能調(diào)用成功
defer func(){
recover()
}
- 包中init函數(shù)引發(fā)的panic只能在init函數(shù)中捕獲,在main函數(shù)中無法被捕獲,原因是init函數(shù)先于main函數(shù)執(zhí)行
