日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Go语言入门指南,带你轻松学Go

發(fā)布時間:2024/4/14 编程问答 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Go语言入门指南,带你轻松学Go 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Go(Golang) 是一個開源的編程語言,它能讓構(gòu)造簡單、可靠且高效的軟件變得容易。

Go是從2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持開發(fā),后來還加入了Ian Lance Taylor, Russ Cox等人,并最終于2009年11月開源,在2012年早些時候發(fā)布了Go 1穩(wěn)定版本。

現(xiàn)在Go的開發(fā)已經(jīng)是完全開放的,并且擁有一個活躍的社區(qū)。

在國內(nèi)外,已經(jīng)有很多大廠開始大規(guī)模使用Golang開發(fā)其云計算相關(guān)產(chǎn)品,比如Google、AWS、Cloudflare、阿里巴巴等。

而Go開發(fā)人員的全球平均薪資也是相當(dāng)高。在美國,使用Go語言的開發(fā)者平均年薪為$ 136K。

在2019年Stack Overflow開發(fā)者調(diào)查中,Go是全球收入第三的語言。

因此,還沒有開始學(xué)習(xí)Go的朋友,不妨來看看我今天推薦的教程《Go 語言實現(xiàn)常見數(shù)據(jù)結(jié)構(gòu)》。

通過使用 Golang 實現(xiàn)常見的數(shù)據(jù)結(jié)構(gòu),加深大家對 Golang 的理解,并且可以強化大家的數(shù)據(jù)結(jié)構(gòu)基本功。

先讓我們一起來看看《Go 語言實現(xiàn)常見數(shù)據(jù)結(jié)構(gòu)》節(jié)選吧,本節(jié)教程主要教大家學(xué)習(xí)Golang的數(shù)組與切片

教程節(jié)選:

實驗1 數(shù)組與切片

實驗介紹

從本實現(xiàn)開始我們將進入到 Golang 的學(xué)習(xí)之旅,Golang 的許多初學(xué)者都會對數(shù)組 (Array) 與切片 (Slice) 感到困惑。

他們雖然同屬于集合類的類型,但是用起來卻十分不同。在本節(jié)實驗中,你將學(xué)習(xí)到數(shù)組與切片到底是哪里不同,這里也是 Golang 面試中的一個常考知識點。

知識點

  • 數(shù)組的數(shù)據(jù)類型
  • 數(shù)組的創(chuàng)建
  • 數(shù)組的遍歷
  • Golang 數(shù)組與切片的區(qū)別
  • 切片的擴容規(guī)律

Golang 數(shù)組基本操作

這一節(jié)開始,我們將學(xué)習(xí) Golang 數(shù)組與切片的常用方法以及他們在具體面試中的常考知識點。

數(shù)組的聲明

Golang 中一個數(shù)組的聲明方式主要有以下幾種。

package mainfunc main() {// 第一種,在初始化時只聲明數(shù)組長度,不聲明數(shù)組內(nèi)容var arr1 [5]int// 第二種,知道數(shù)據(jù)很多,不想自己寫長度的時候可以用這種方式// 聲明之后由編譯器自己推算數(shù)組長度arr2 := [...]int{1,3,5,7,9}// 第三種,聲明的時候長度和初值一起聲明arr3 := [3]int{2,4,6}// 二維數(shù)組的聲明,其意義是三行五列var Block [3][5]int }

這里值得一提的是 Golang 中的數(shù)組的初始值如果你不做聲明的話默認是全部有初值的。 比如 arr1 這個數(shù)組雖然只聲明了長度為 5,但是 Go 的編譯器也會把這 5 個元素全都初始化為 0。而對于 bool 值類型的數(shù)組,如果不做賦值操作,則初始值全為 false。在接下來的數(shù)組遍歷中我們會實際的驗證它。

數(shù)組的遍歷

我們先在實驗樓在線實驗環(huán)境中新建新建一個名叫 array 的文件夾。如下圖所示,先點擊 File,然后點擊 New Folder 創(chuàng)建名為 array 的文件夾。

然后我們右鍵點擊 array 文件夾,選擇 New File,創(chuàng)建一個叫 main.go 的文件,如下圖所示。

Go 的數(shù)組遍歷主要有以下兩種方式。首先鍵入以下代碼:

package mainimport "fmt"func main() {// 第一種,在初始化時只聲明數(shù)組長度,不聲明數(shù)組內(nèi)容var arr1 [5]int// 第二種,知道數(shù)據(jù)很多,不想自己寫長度的時候可以用這種方式// 聲明之后由編譯器自己推算數(shù)組長度//arr2 := [...]int{1,3,5,7,9}第三種,聲明的時候長度和初值一起聲明//arr3 := [3]int{2,4,6}二維數(shù)組的聲明,其意義是三行五列var Block [3][5]bool// 第一種for i := 0 ; i<len(arr1); i++{fmt.Printf("%d\n",arr1[i])}// 第二種for index, value := range arr1 {fmt.Printf("索引:%d, 值: %d\n",index,value)}// 以第二種方式遍歷二維數(shù)組,只取值,也就是取出一個數(shù)組for _,v := range Block {// 再對這個數(shù)組取值for _,value := range v {fmt.Printf("%v ",value)}fmt.Printf("\n")}}

接下來,在終端執(zhí)行:

cd array go run main.go

結(jié)果如下:

其中 Go 語言官方更加提倡的是第二種以 range 的方式進行遍歷,這樣寫會讓代碼更加優(yōu)雅,而且絕對不會越界。

那么,如果我只想要數(shù)組里的 index 不想要 value 時怎么 range 呢?

答案其實很簡單,i := range arr 就可以了。如果你只想要 value 不想要索引的時候就可以這樣寫 _, value := range arr, 注意這里的下劃線不能省略。

封裝一個數(shù)組打印函數(shù)

現(xiàn)在咱們封裝一個用來打印數(shù)組的函數(shù)并對其進行測試,代碼如下:

func PrintArr(arr [5]int) {// 第二種for index, value := range arr {fmt.Printf("索引:%d, 值: %d\n",index,value)} }

我們分別將 arr1,2,3 傳入打印,先猜測一下會發(fā)生什么結(jié)果呢?

package mainimport "fmt"func main() {// 第一種,在初始化時只聲明數(shù)組長度,不聲明數(shù)組內(nèi)容var arr1 [5]int// 第二種,知道數(shù)據(jù)很多,不想自己寫長度的時候可以用這種方式// 聲明之后由編譯器自己推算數(shù)組長度arr2 := [...]int{1,3,5,7,9}第三種,聲明的時候長度和初值一起聲明arr3 := [3]int{2,4,6}PrintArr(arr1)PrintArr(arr2)PrintArr(arr3) }func PrintArr(arr [5]int) {// 第二種for index, value := range arr {fmt.Printf("索引:%d, 值: %d\n",index,value)} }

結(jié)果是程序在打印 arr3 時拋出了如下異常。

這個就要牽扯出一個概念了,Go 語言中數(shù)組是值類型。也就是說[3]int,和[5]int 在 go 中會認為是兩個不同的數(shù)據(jù)類型。

同樣地,你在 PrintArr 中改變數(shù)組中的值也不會改變原數(shù)組的值。

到了這里你肯定覺得 go 的數(shù)組太難用了,又要數(shù)據(jù)類型統(tǒng)一又要長度統(tǒng)一才能傳遞。確實是這樣的,在 go 中我們一般不直接使用數(shù)組。而是使用我們今天的主角,切片。

Golang 切片的基本操作

一般而言,Go 語言的切片比數(shù)組更加靈活,強大而且方便。數(shù)組是按值傳遞的(即是傳遞的副本),而切片是引用類型,傳遞切片的成本非常小,而且是不定長的。

而且數(shù)組是定長的,而切片可以調(diào)整長度。創(chuàng)建切片的語法如下:

  • make([ ]Type, length, capacity)
  • make([ ]Type, length)
  • [ ]Type{}
  • [ ]Type{value1, value2, …, valueN}

內(nèi)置函數(shù) make() 用于創(chuàng)建切片、映射和通道。當(dāng)用于創(chuàng)建一個切片時,它會創(chuàng)建一個隱藏的初始化為零值的數(shù)組,然后返回一個引用該隱藏數(shù)組的切片。

該隱藏的數(shù)組與 Go 語言中的所有數(shù)組一樣,都是固定長度,如果使用第一種語法創(chuàng)建,那么其長度為切片的容量 capacity ;如果是第二種語法,那么其長度記為切片的長度 length 。一個切片的容量即為隱藏數(shù)組的長度,而其長度則為不超過該容量的任意值。另外可以通過內(nèi)置的函數(shù) append() 來增加切片的容量。

我們來執(zhí)行一下下面的程序:

package mainimport "fmt"func main() {slice := make([]int,0)for i := 0 ;i < 10; i++ {// 動態(tài)的對切片進行擴容slice = append(slice, i)}fmt.Println(slice)// 調(diào)用PrintArrPrintArr(slice)// 看看是否切片的第一個元素改變了?fmt.Println(slice) }func PrintArr(arr []int) {arr[0] = 100for index, value := range arr {fmt.Printf("索引:%d, 值: %d\n",index,value)} }

執(zhí)行結(jié)果:

執(zhí)行之后我們會發(fā)現(xiàn) slice[0] 的值確實被改變了。因為切片是引用傳遞,也就是直接把切片在內(nèi)存中的地址傳遞過去。

這樣我們在其他函數(shù)中對其進行修改也會影響原來的切片的數(shù)據(jù)。這樣做的好處是傳引用因為不用把原數(shù)據(jù)拷貝一份,所以對系統(tǒng)的開銷比較小。

切片的切割

切片最大的特色就是可以靈活的進行切分,比如下面的例子。

package mainimport "fmt"func main() {slice := make([]int,0)for i := 0 ;i < 10; i++ {slice = append(slice, i)}fmt.Println(slice)s2 := slice[2:4]fmt.Println(s2) }

執(zhí)行結(jié)果:

這里的 2 可被稱為起始索引,4 可被稱為結(jié)束索引。那么 s2 的長度就是 4 減去 2,即 2。因此可以說,s2 中的索引從 0 到 1 指向的元素對應(yīng)的是 slice 及其底層數(shù)組中索引從 2 到 3 的那 2 個元素。

到這里我們就可以推出 [n:m] 的意思是取區(qū)間 [n,m) 的數(shù)據(jù)賦值給新的切片。

關(guān)于數(shù)組與切片兩道常見面試題

  • Golang 切片的擴容規(guī)則。

一旦一個切片無法容納更多的元素,Go 語言就會想辦法擴容。但它并不會改變原來的切片,而是會生成一個容量更大的切片,然后將把原有的元素和新元素一并拷貝到新切片中。在一般的情況下,你可以簡單地認為新切片的容量將會是原切片容量的 2 倍。 但是,當(dāng)原切片的長度大于或等于 1024 時,Go 語言將會以原容量的 1.25 倍作為新容量的基準。因為繼續(xù)再乘以 2 的話切片容量增加的太快,很容易產(chǎn)生大量的浪費無意義的空間。 不過,如果我們一次追加的元素過多,以至于使新長度比原容量的 2 倍還要大,那么新容量就會以新長度為基準。比如你現(xiàn)在的切片長度為 10,現(xiàn)在一下往里面添加了 30 個元素,那么 Golang 會直接創(chuàng)建一個新的長度為 40 的底層數(shù)組,然后把所有的數(shù)據(jù)拷貝進去。

  • Golang 切片的底層數(shù)組在什么情況下會改變?

其實這里的典型回答應(yīng)該是永遠不會改變。因為當(dāng)切片需要擴容時,新的切片誕生的同時也會創(chuàng)建出新的底層數(shù)組,它只是把原數(shù)組的數(shù)據(jù)拷貝了進來,并未對其做任何的修改。

一道思考題

現(xiàn)在我們已經(jīng)學(xué)習(xí)了如何對數(shù)組進行“擴容”,那么你能否使用“擴容”的方式,把原切片進行縮容呢?請嘗試寫出代碼,或查閱相關(guān)資料。

篇幅有限,暫時發(fā)布以上內(nèi)容。

之后還有“棧與棧的應(yīng)用”“隊列與循環(huán)隊列”等內(nèi)容可以學(xué)習(xí),感興趣的朋友可以在《Go 語言實現(xiàn)常見數(shù)據(jù)結(jié)構(gòu)》,學(xué)習(xí)之后的內(nèi)容。

總結(jié)

以上是生活随笔為你收集整理的Go语言入门指南,带你轻松学Go的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。