??博主CSDN主頁:杭電碼農(nóng)-NEO??
?
?專欄分類:Go語言專欄?
?
??代碼倉庫:NEO的學(xué)習(xí)日記??
?
??關(guān)注我??帶你學(xué)習(xí)更多Go語言知識
? ????
1. 前言
在了解過GO的控制語句和函數(shù)后,按照學(xué)習(xí)語言的邏輯也理應(yīng)進入到容器的學(xué)習(xí),GO語言的容易比較特殊,它不像C++一樣有專門的STL庫,類型也沒有其他語言那么多.但是都非常的實用!
本章重點:
本篇文章會講解GO語言中數(shù)組的使用,以及GO語言中的切片是什么,映射是什么?它們應(yīng)該如何使用?最后會講解GO語言中捕捉錯誤的方式.文章重在實踐,底層原理不涉及
2. 數(shù)組詳解
如何定義數(shù)組:
var arr [3]int
//分別對應(yīng) arr->數(shù)組名, [3]->數(shù)組的大小 int->數(shù)組中元素類型
arr[0] = 10
arr[1] = 20
arr[2] = 30
如何遍歷數(shù)組: 兩種方法
var arr [3]int
arr[0] = 10
arr[1] = 20
arr[2] = 30
//普通for循環(huán)
for i:=0;i<len(arr);i++{
fmt.Println(arr[i])
}
//for - range遍歷
for k,v := range arr{
fmt.Printf("下標(biāo)為: %d,值為: %d",k,v)
}
如何初始化數(shù)組: 四種方法
//方法一
var arr [3]int{3,6,9}
//方法二
var arr = [3]int{2,4,6}
//方法三,不定長,當(dāng)初始化為1.3.5.7.9后,長度自動變成5
var arr = [...]int{1,3,5,7,9}
//方法四,指定下標(biāo)的值,下標(biāo)2的值為66,下標(biāo)3的值為77,以此類推
var arr = [...]int{2:66,3:77,1:11,0:55}
二維數(shù)組的使用:
//2×3的數(shù)組
var arr [2][3]int = [2][3]int{ {1,4,7} , {2,5,8} }
for k,v := range arr{
for key,value := range v{
fmt.Println(value)
}
}
數(shù)組的注意事項:
- 數(shù)組不能像C++的vector一樣增加/刪除元素,更無法擴容.它定義,初始化好后的長度就定了
- 數(shù)組在GO中的使用較少,切片的使用較多(切片是動態(tài)增長的)
3. 切片詳解
切片是golang的特有類型,它是一種建立在數(shù)組類型之上的一種抽象結(jié)構(gòu), 切片(slice)是對數(shù)組的一個連續(xù)的片段的引用,所以切片是引用類型.這個引用可以是整個數(shù)組,也可以是數(shù)組中某個特定的區(qū)間
切片底層有三個字段
- 指向底層數(shù)組的指針
- 切片的長度: length
- 切片的容量: capacity
如果你學(xué)過vector的底層,會發(fā)現(xiàn)和切片是一樣的
切片的定義:
1. 通過數(shù)組來定義切片
//先定義一個數(shù)組
var arr = [6]int{1,2,3,4,5,6}
//定義一個切片,名字是slice,是動態(tài)變化的數(shù)組
var slice1 []int = arr[1:4]
//切片的索引從1開始到4結(jié)束,但不包含下標(biāo)4,也就是說切片的內(nèi)容為2.3.4
var slice2 := arr[2:5]
2. 使用make函數(shù)定義切片
//make函數(shù)的參數(shù)分別代表切片對于的類型,切片的長度,切片的容量
slice := make([]int,4,20)
slice[0] = 10
slice[1] = 20
fmt.Println(slice)
3. 直接定義
slice := []int{2,4,6,8}
切片是可以動態(tài)增長的,使用append函數(shù):
slice1 := []int{3,6,9}
//使用append不會影響原來的數(shù)組,會創(chuàng)建一份新的空間
slice2 := append(slice1,12,15}//一次性可以追加多個內(nèi)容,甚至追加多個切片
fmt.Println(slice2)
slice2 := append(slice2,18,21)//可自己追加自己
當(dāng)你不斷的向切片中增加數(shù)據(jù)直到達到了切片的容量上限后,切片會進行擴容,所以說切片實際上和C++中的vector是類似的,只不過切片沒有直接支持刪除操作,我們可以通過一些特有的后端來達到刪除的效果.一種常用的方法是使用切片的切片操作(slice operation)來刪除元素。你可以將要刪除的元素之前的元素和之后的元素組合起來,形成一個新的切片,從而達到刪除元素的目的。下面是一個示例代碼:
func removeElement(slice []int, index int) []int {
return append(slice[:index], slice[index+1:]...)
}
func main() {
slice := []int{1, 2, 3, 4, 5}
index := 2
newSlice := removeElement(slice, index)
fmt.Println(newSlice) // 輸出: [1 2 4 5]
}
切片的遍歷: 方法和數(shù)組是一樣的
4. 映射詳解
所謂的映射(map),其實就是哈希,只不過GO語言中將map設(shè)成了內(nèi)置的類型,和int,string等是同等地位
map初始化后是不會分配空間的,所以要使用make來初始化.并且map的key-value是無序的,如果你學(xué)過C++的map和unordered_map的話,你就可以明白,GO的map是無序的,所以它底層肯定是用的哈希,而不是紅黑樹
//定義一個map變量a,它的key-value類型是int-string. 它能存儲10對鍵值對
var a map[int]string = make(map[int]string,10)
a[001] = "張三"
a[002] = "李四"
a[003] = "王五"
var b map[int]string = make(map[int]string)
//若沒分配空間,使用時會自動擴容
注意,key是不可重復(fù)的,可能出現(xiàn)了重復(fù)的key,第一個value會被第二個value替換
//除此之外,map還可以這樣定義
c := map[int]string{
2001 : "張三"
2002 : "李四"
2003 : "王五"
}
map的遍歷:
var a map[int]string = make(map[int]string,10)
a[001] = "張三"
a[002] = "李四"
a[003] = "王五"
for k,v := range a{
fmt.Printf("key為: %d, value為: %d",k,v)
}
5. GO語言的錯誤處理
GO語言代碼追求優(yōu)雅簡潔,所以它引入了defer+recover的機制來處理錯誤,如果你不知道defer關(guān)鍵字的作用,請移步這篇文章: go語言函數(shù)講解
先來個實例看看:
//1. 不使用錯誤處理
func test(){
num1 := 10
num2 := 0
result := num1/num2
fmt.Println(result)
}
func main(){
test()
}
此場景中,不進行錯誤捕捉處理的話,代碼執(zhí)行到num1/num2時,就會報錯,程序會直接退出.但是某些時候,這些錯誤并不致命,還不至于直接讓程序退出.所以說需要使用錯誤捕捉的方式來處理錯誤
//2. 使用錯誤處理
//defer+匿名函數(shù),捕捉到錯誤后還會向后執(zhí)行代碼,不會退出程序
func test(){
//利用defer+recover來捕獲錯誤
defer func(){
//調(diào)用recover內(nèi)置函數(shù),可以捕捉錯誤
err := recover()
//如果沒有錯誤,會返回零值,也就是nil
if err !=nil{
fmt.Println("錯誤已經(jīng)捕獲,err是: ",err)
}
}
num1 := 10
num2 := 0
result := num1/num2
fmt.Println(result)
}
func main(){
test()
}
自定義錯誤類型:
文章來源:http://www.zghlxwxcb.cn/news/detail-861906.html
func test() (err error){
num1 := 10
num2 := 0
if num2==0{
//拋出自定義錯誤
return errors.New("除數(shù)不能為0哦~~")
}else{//如果除數(shù)不為0再正常執(zhí)行代碼
result := num1/num2
fmt.Println(result)
//沒有錯誤,就返回nil
return nil
}
}
6. 總結(jié)
GO的用法很簡潔,很規(guī)范,有句話叫優(yōu)雅的代碼會說話,這也是為什么越來越多的大廠都在轉(zhuǎn)GO的原因.GO語言雖然沒有像C++的STL庫中那么多數(shù)據(jù)結(jié)構(gòu),但GO中有的類型都是最實用的,GO拋棄了繁雜并且瑣碎的結(jié)構(gòu),這一點會在后面的學(xué)習(xí)中慢慢體現(xiàn)文章來源地址http://www.zghlxwxcb.cn/news/detail-861906.html
到了這里,關(guān)于【Go語言快速上手(三)】數(shù)組, 切片與映射的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!