国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Go語言快速上手(三)】數(shù)組, 切片與映射

這篇具有很好參考價值的文章主要介紹了【Go語言快速上手(三)】數(shù)組, 切片與映射。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

??博主CSDN主頁:杭電碼農(nóng)-NEO??
?
?專欄分類:Go語言專欄?
?
??代碼倉庫:NEO的學(xué)習(xí)日記??
?
??關(guān)注我??帶你學(xué)習(xí)更多Go語言知識
? ????


【Go語言快速上手(三)】數(shù)組, 切片與映射,Go語言專欄,重生之我在鵝廠摸魚,golang,開發(fā)語言,后端

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ū)間

【Go語言快速上手(三)】數(shù)組, 切片與映射,Go語言專欄,重生之我在鵝廠摸魚,golang,開發(fā)語言,后端

切片底層有三個字段

  1. 指向底層數(shù)組的指針
  2. 切片的長度: length
  3. 切片的容量: 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)

【Go語言快速上手(三)】數(shù)組, 切片與映射,Go語言專欄,重生之我在鵝廠摸魚,golang,開發(fā)語言,后端

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等是同等地位

【Go語言快速上手(三)】數(shù)組, 切片與映射,Go語言專欄,重生之我在鵝廠摸魚,golang,開發(fā)語言,后端

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替換

【Go語言快速上手(三)】數(shù)組, 切片與映射,Go語言專欄,重生之我在鵝廠摸魚,golang,開發(fā)語言,后端

//除此之外,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ù)講解

【Go語言快速上手(三)】數(shù)組, 切片與映射,Go語言專欄,重生之我在鵝廠摸魚,golang,開發(fā)語言,后端

先來個實例看看:

//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()
}

自定義錯誤類型:

【Go語言快速上手(三)】數(shù)組, 切片與映射,Go語言專欄,重生之我在鵝廠摸魚,golang,開發(fā)語言,后端

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


?? 下期預(yù)告:面向?qū)ο笕筇匦???

到了這里,關(guān)于【Go語言快速上手(三)】數(shù)組, 切片與映射的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包