以下內(nèi)容部分參考自
Go語言基礎(chǔ)數(shù)據(jù)類型
Go語言中的數(shù)組切片:特立獨行的可變數(shù)組
Go語言數(shù)據(jù)類型-數(shù)組
Go標準容器之List
1. 整形
其中比較特殊的是rune和uintptr。
rune 類型是 Unicode 字符類型张漂,和 int32 類型等價跑揉,通常用于表示一個 Unicode 碼點直撤。rune 和 int32 可以互換使用职恳。
uintptr 是一種無符號的整數(shù)類型沈跨,沒有指定具體的bit大小但是足以容納指針量九。 uintptr類型只有在底層編程是才需要黍檩,特別是Go語言和C語言函數(shù)庫或操作系統(tǒng)接口相交互的地方申钩。
2. 浮點型
Go語言提供了兩種精度的浮點數(shù)次绘,float32和float64。兩者就是范圍的不同撒遣,具體選擇看具體需求邮偎。
3. 復(fù)數(shù)
這種數(shù)據(jù)類型在其他語言中是比較少見的,Go語言提供了兩種精度的復(fù)數(shù)類型:complex64和complex128义黎,分別對應(yīng)float32和float64兩種浮點數(shù)精度禾进。
var z = x + yi //構(gòu)建復(fù)數(shù)
x = real(z) //取出實部
y = imag(z) //取出虛部
4. 布爾型
常用的true、false類型廉涕。
5. 字符串
Go語言中的字符串比js泻云、c#中的字符串少了一些封裝。
比如下標訪問直接訪問的是字節(jié)狐蜕,獲取長度也是字節(jié)的長度宠纯。想要按字符進行下標訪問,需要先用rune執(zhí)行切片操作层释。
var s = "123你好";
println(len(s)); //9
println(len([]rune(s))); //5
println(string(([]rune(s))[:4])); //123你
標準庫中有四個包對字符串處理尤為重要:bytes婆瓜、strings、strconv和unicode包贡羔。對字符串的常用操作都可以通過這四個包進一步封裝廉白。
6. 常量
如常數(shù)e和pi,此處不表乖寒。
7. Array
//聲明
var arr1 [5]int
var arr2 = [5]int{1, 2, 3, 4, 5} //指定長度為5蒙秒,并賦5個初始值
var arr3 = [5]int{1, 2, 3} //指定長度為5,對前3個元素進行賦值宵统,其他元素為零值
var arr4 = [5]int{4: 1} //指定長度為5晕讲,對第5個元素賦值
var arr5 = [...]int{1, 2, 3, 4, 5} //不指定長度覆获,對數(shù)組賦以5個值
var arr6 = [...]int{8: 1} //不指定長度,對第9個元素(下標為8)賦值1
//[0 0 0 0 0][1 2 3 4 5] [1 2 3 0 0] [0 0 0 0 1] [1 2 3 4 5] [0 0 0 0 0 0 0 0 1]
fmt.Print(arr1,arr2,arr3,arr4,arr5,arr6);
//獲取數(shù)組長度
fmt.Print(len(arr1)); //5
//通過下標訪問元素
fmt.Print(arr5[2]); //3
//通過range訪問元素
for i, v := range arr {
//range具有兩個返回值瓢省,第一個返回值i是元素的數(shù)組下標弄息,第二個返回值v是元素的值。
fmt.Println(i, v)
}
數(shù)組是Go語言編程中最常用的數(shù)據(jù)結(jié)構(gòu)之一勤婚。
與部分語言不同的是摹量,Go語言中的數(shù)組是值類型的,不是引用類型的馒胆。所以調(diào)用函數(shù)傳進一個數(shù)組參數(shù)缨称,函數(shù)內(nèi)部修改數(shù)組參數(shù)不會影響外部數(shù)組的值。
8.Slice
slice是對底層數(shù)組的抽象和控制祝迂,使用slice可以動態(tài)控制數(shù)組的增長和收縮睦尽。
//slice聲明,3個參數(shù)型雳,分別為類型当凡、長度、容量
var arr1 = make([]int,3,5);
//slice聲明纠俭,不定長度沿量,與數(shù)組相似,但是[]中間不需要指定長度
var arr2 = []int{1, 2, 3, 4, 5};
//數(shù)組動態(tài)增加元素
arr2 = append(arr2,6);
fmt.Print(arr2); //[1 2 3 4 5 6]
類型冤荆、長度和Array一樣理解朴则,容量指給數(shù)組變動預(yù)留的內(nèi)存大小,提前給你劃好內(nèi)存區(qū)域钓简,如果擴展長度不用重新申請內(nèi)存佛掖。
append操作會每次考察你的容量是否足夠,如果不夠會重新申請內(nèi)存涌庭,所有設(shè)置合理的容量芥被,可以避免反復(fù)申請內(nèi)存,提高性能坐榆。
這里我并沒有提到刪除元素的方法拴魄,因為從slice這種數(shù)據(jù)結(jié)構(gòu)來看,本身并不適合做刪除操作席镀。拋開語言匹中,只談數(shù)據(jù)結(jié)構(gòu),我們知道數(shù)組刪除是會移動元素的豪诲,效率會比較低顶捷。當然任何語言的數(shù)組實現(xiàn)(順序存儲),刪除元素都避免不了移動元素屎篱。
所以服赎,如果會頻繁刪除中間或開頭的元素葵蒂,更好的是選擇鏈表這樣的數(shù)據(jù)結(jié)構(gòu),如map或container/list包重虑。
如果一定要執(zhí)行刪除操作的話践付,可以這么寫:
var arr = []int{1, 2, 3, 4, 5};
var deleteIndex = 2; //待刪除的元素下標
var newArr = append(arr[:deleteIndex],arr[deleteIndex+1:]...);
fmt.Print(newArr); //[1 2 4 5]
9.Map
Go語言中的映射類型,相當于哈希表缺厉。
var temp1 = make(map[string]int); //初始化
temp1["dog"] = 233; //添加值
println(temp1["dog"]) //233
var value,isExist = temp1["cat"]; //value-值永高,isExist-是否存在這個key
println(value); //0
println(isExist); //false
var temp2 = map[string]int{"one":1,"two":2}; //初始化
println(len(temp2)); //2
delete(temp2,"two"); //刪除值
println(len(temp2)); //1
10.List
使用起來非常方便、簡單的動態(tài)數(shù)組提针。
var list = list2.New();
list.PushBack(1);
list.PushBack(2);
list.PushFront(3);
list.PushFront(4);
list.Remove(list.Front());
list.InsertBefore(5,list.Front());
//遍歷數(shù)組壶硅,輸出:5312
for e := list.Front(); e != nil; e = e.Next() {
fmt.Print(e.Value)
}