go語言切片范圍 go語言數組和切片

golang-101-hacks(12)——切片作為函數參數傳遞

注:本文是對 golang-101-hacks 中文翻譯。

創新互聯建站主要從事網站制作、成都網站建設、網頁設計、企業做網站、公司建網站等業務。立足成都服務鶴崗,10年網站建設經驗,價格優惠、服務專業,歡迎來電咨詢建站服務:18982081108

在Go語言中,函數參數是值傳遞。使用slice作為函數參數時,函數獲取到的是slice的副本:一個指針,指向底層數組的起始地址,同時帶有slice的長度和容量。既然各位熟知數據存儲的內存的地址,現在可以對切片數據進行修改。讓我們看看下面的例子:

In Go, the function parameters are passed by value. With respect to use slice as a function argument, that means the function will get the copies of the slice: a pointer which points to the starting address of the underlying array, accompanied by the length and capacity of the slice. Oh boy! Since you know the address of the memory which is used to store the data, you can tweak the slice now. Let's see the following example:

運行結果如下

由此可見,執行modifyValue函數,切片s的元素發生了變化。盡管modifyValue函數只是操作slice的副本,但是任然改變了切片的數據元素,看另一個例子:

You can see, after running modifyValue function, the content of slice s is changed. Although the modifyValue function just gets a copy of the memory address of slice's underlying array, it is enough!

See another example:

The result is like this:

而這一次,addValue函數并沒有修改main函數中的切片s的元素。這是因為它只是操作切片s的副本,而不是切片s本身。所以如果真的想讓函數改變切片的內容,可以傳遞切片的地址:

This time, the addValue function doesn't take effect on the s slice in main function. That's because it just manipulate the copy of the s, not the "real" s.

So if you really want the function to change the content of a slice, you can pass the address of the slice:

運行結果如下

go語言中為什么使用切片指針?

這仍然是一個值傳遞和地址傳遞的問題, 直接看例子:

運行結果是 [b b a][a a] ,所以函數里的改動沒有傳遞到函數外面,這就是值傳遞。

再看地址傳遞的例子:

運行結果是: [b b a][b b a]

go語言循環隊列的實現

隊列的概念在 順序隊列 中,而使用循環隊列的目的主要是規避假溢出造成的空間浪費,在使用循環隊列處理假溢出時,主要有三種解決方案

本文提供后兩種解決方案。

順序隊和循環隊列是一種特殊的線性表,與順序棧類似,都是使用一組地址連續的存儲單元依次存放自隊頭到隊尾的數據元素,同時附設隊頭(front)和隊尾(rear)兩個指針,但我們要明白一點,這個指針并不是指針變量,而是用來表示數組當中元素下標的位置。

本文使用切片來完成的循環隊列,由于一開始使用三個參數的make關鍵字創建切片,在輸出的結果中不包含nil值(看起來很舒服),而且在驗證的過程中發現使用append()函數時切片內置的cap會發生變化,在消除了種種障礙后得到了一個四不像的循環隊列,即設置的指針是順序隊列的指針,但實際上進行的操作是順序隊列的操作。最后是對make()函數和append()函數的一些使用體驗和小結,隊列的應用放在鏈隊好了。

官方描述(片段)

即切片是一個抽象層,底層是對數組的引用。

當我們使用

構建出來的切片的每個位置的值都被賦為interface類型的初始值nil,但是nil值也是有大小的。

而使用

來進行初始化時,雖然生成的切片中不包含nil值,但是無法通過設置的指針變量來完成入隊和出隊的操作,只能使用append()函數來進行操作

在go語言中,切片是一片連續的內存空間加上長度與容量的標識,比數組更為常用。使用 append 關鍵字向切片中追加元素也是常見的切片操作

正是基于此,在使用go語言完成循環隊列時,首先想到的就是使用make(type, len, cap)關鍵字方式完成切片初始化,然后使用append()函數來操作該切片,但這一方式出現了很多問題。在使用append()函數時,切片的cap可能會發生變化,用不好就會發生擴容或收縮。最終造成的結果是一個四不像的結果,入隊和出隊操作變得與指針變量無關,失去了作為循環隊列的意義,用在順序隊列還算合適。

參考博客:

Go語言中的Nil

Golang之nil

Go 語言設計與實現

Go語言和其他語言的不同之基本語法

Go語言作為出現比較晚的一門編程語言,在其原生支持高并發、云原生等領域的優秀表現,像目前比較流行的容器編排技術Kubernetes、容器技術Docker都是用Go語言寫的,像Java等其他面向對象的語言,雖然也能做云原生相關的開發,但是支持的程度遠沒有Go語言高,憑借其語言特性和簡單的編程方式,彌補了其他編程語言一定程度上的不足,一度成為一個熱門的編程語言。

最近在學習Go語言,我之前使用過C#、Java等面向對象編程的語言,發現其中有很多的編程方式和其他語言有區別的地方,好記性不如爛筆頭,總結一下,和其他語言做個對比。這里只總結差異的地方,具體的語法不做詳細的介紹。

種一棵樹最好的時間是十年前,其次是現在。

3)變量初始化時候可以和其他語言一樣直接在變量后面加等號,等號后面為要初始化的值,也可以使用變量名:=變量值的簡單方式

3)變量賦值 Go語言的變量賦值和多數語言一致,但是Go語言提供了多重賦值的功能,比如下面這個交換i、j變量的語句:

在不支持多重賦值的語言中,交換兩個變量的值需要引入一個中間變量:

4)匿名變量

在使用其他語言時,有時候要獲取一個值,卻因為該函數返回多個值而不得不定義很多沒有的變量,Go語言可以借助多重返回值和匿名變量來避免這種寫法,使代碼看起來更優雅。

假如GetName()函數返回3個值,分別是firstName,lastName和nickName

若指向獲得nickName,則函數調用可以這樣寫

這種寫法可以讓代碼更清晰,從而大幅降低溝通的復雜度和維護的難度。

1)基本常量

常量使用關鍵字const 定義,可以限定常量類型,但不是必須的,如果沒有定義常量的類型,是無類型常量

2)預定義常量

Go語言預定義了這些常量 true、false和iota

iota比較特殊,可以被任務是一個可被編譯器修改的常量,在每個const關鍵字出現時被重置為0,然后在下一個const出現之前每出現一個iota,其所代表的數字會自動加1.

3)枚舉

1)int 和int32在Go語言中被認為是兩種不同類型的類型

2)Go語言定義了兩個浮點型float32和float64,其中前者等價于C語言的float類型,后者等價于C語言的double類型

3)go語言支持復數類型

復數實際上是由兩個實數(在計算機中使用浮點數表示)構成,一個表示實部(real)、一個表示虛部(imag)。也就是數學上的那個復數

復數的表示

實部與虛部

對于一個復數z=complex(x,y),就可以通過Go語言內置函數real(z)獲得該復數的實部,也就是x,通過imag(z)獲得該復數的虛部,也就是y

4)數組(值類型,長度在定義后無法再次修改,每次傳遞都將產生一個副本。)

5)數組切片(slice)

數組切片(slice)彌補了數組的不足,其數據結構可以抽象為以下三個變量:

6)Map 在go語言中Map不需要引入任何庫,使用很方便

Go循環語句只支持for關鍵字,不支持while和do-while

goto語句的語義非常簡單,就是跳轉到本函數內的某個標簽

今天就介紹到這里,以后我會在總結Go語言在其他方面比如并發編程、面向對象、網絡編程等方面的不同及使用方法。希望對大家有所幫助。

當前標題:go語言切片范圍 go語言數組和切片
網頁地址:http://m.kartarina.com/article42/hgcjec.html

成都網站建設公司_創新互聯,為您提供軟件開發用戶體驗搜索引擎優化定制開發網頁設計公司

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

小程序開發
主站蜘蛛池模板: 国产成人精品无码一区二区三区| 免费无遮挡无码视频网站| 人妻丰满?V无码久久不卡| 国产精品无码一区二区三区不卡 | 亚洲AV无码成人精品区狼人影院| 久久久久久亚洲AV无码专区| 真人无码作爱免费视频| 亚洲va无码va在线va天堂| 亚洲aⅴ天堂av天堂无码麻豆| 亚洲AV综合色区无码一区爱AV| 亚洲国产成人无码AV在线| 无码精品A∨在线观看中文| 精品人妻中文无码AV在线| 精品无码一区二区三区电影| 国产aⅴ激情无码久久| 国产午夜无码视频免费网站| 日韩网红少妇无码视频香港| 中文字幕丰满乱孑伦无码专区| 无码免费午夜福利片在线 | 久久精品无码精品免费专区| 乱人伦人妻中文字幕无码| 午夜不卡久久精品无码免费| 亚洲人成无码www久久久| 亚洲熟妇无码av另类vr影视| 国产爆乳无码一区二区麻豆 | 国产成人精品无码一区二区三区| JAVA性无码HD中文| 亚洲av无码一区二区三区不卡| 国产亚洲精品无码专区| 国产精品无码一二区免费| 无遮掩无码h成人av动漫| 亚洲精品中文字幕无码AV| 无码国产精品一区二区免费3p| 亚洲午夜国产精品无码老牛影视| 影院无码人妻精品一区二区| 国模无码视频一区二区三区| 精品无码久久久久久国产| 亚洲6080yy久久无码产自国产| 成人无码区免费A片视频WWW| 无码人妻啪啪一区二区| 久久无码av亚洲精品色午夜|