公司最近打算啓動一個新項目:實現接口級別的mock服務,技術棧需要利用Go的超強併發能力。很早就聽聞過Go的大名了,趁這個機會跟着大佬們學一學,目前還在不斷學習中,邊學習邊整理整理學習筆記。
一、包
package <name>
包有兩種類型,可執行包和應用包。
- 可執行包生成可執行程序,必須使用
package main
,而且文件中必須有且僅有一個main函數。 - 應用包本身是不可執行的,編寫保存後會自動在pkg目錄下保存一個.a文件,包內可以有多個源文件,其中被引用的方法需要設置爲:首字母大寫.。設置包名name時一般與文件名相同,但這並不是必須的。
import <packagename>
導入源碼文件所依賴的包,導入的包其實就是目錄名。Go程序首先會去“GOROOT/src”目錄下找,如果沒找到則會繼續去“GOPATH/src”找。
二、數組VS切片
切片是擁有相同類型元素的可變長度的序列,數組是不可變的,可以理解爲切片是指向數組的某塊區域的引用,可以是數組的一部分也可以是全部。
1.切片的初始化
- 數組:
var name [num]T
默認初始化,有默認值
var name = [num]T{n1,n2,…}
使用指定值初始化 - 切片:
var name []T
聲明一個切片,未初始化,爲nil(切片、函數、指針變量的默認爲nil)
var name = []T{n1,n2,…}
初始化一個切片,不爲nil
可以看出: 數組和切片初始化的明顯也是唯一的區別就是數組必須定義長度,而切片不用定義長度。這也體現了它們的不可變長度與可變長度的特點。
2.得到切片
- 初始化切片
- 利用數組得到切片
a := [4]int{1,2,3,4}
初始化一個數組
b := a[1:3]
//左閉右開,包含a[1],a[2]:[2,3] - 切片再切片
c := b[0:2]
//包含a[1],a[2]:[2,3]
d := b[1:3]
//包含a[2],a[3]:[3,4] - 構造切片
使用make()函數構造,make([]T,size,cap)
// size: 切片中元素的數量;cap: 切片的容量
a := make([]int,5,10)
則:len(a);
//5cap(a);
//10 (內存空間給切片分配了10個,只使用了5個。)
關於切片的類型和實質,我畫了個圖應該可以看的很清楚。切片是引用類型,一個切片包含三個部分:指針、長度、容量,下圖可見,該切片指向底層數組a[2],長度爲4,容量爲7。
3.遍歷
- 索引遍歷:
for i := 0; I < len(s); i++{}
- for range遍歷:
for index, value := range{}
4.用append()方法爲切片添加元素
- 切片會自動擴容,容量會按1,2,4,8,16,…… 擴充
利用方法:s = append(s, i)
把元素 i 添加到切片中的元素後
5.用copy()方法複製切片
- 如果直接把切片1的值賦給切片2,那麼它們實際上使用的是同一個底層數組,修改其中任意一個切片的值都會影響另一個切片,因此需要用其他方法來複制切片:
copy(destSlice, srcSlice)
destSlice:目標切片,srcSlice: 源切片
6.刪除切片中的元素
- 切片是引用類型,不像數組一樣長度空間都十分固定,要刪除切片的元素,可以利用它的特性:
s := []int{0,1,2,3,4,5}
s = append(s, a[:3],a[4:])
//刪除第3個元素