注:本文是對 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:
運行結果如下
這仍然是一個值傳遞和地址傳遞的問題, 直接看例子:
運行結果是 [b b a][a a] ,所以函數里的改動沒有傳遞到函數外面,這就是值傳遞。
再看地址傳遞的例子:
運行結果是: [b b a][b b a]
隊列的概念在 順序隊列 中,而使用循環隊列的目的主要是規避假溢出造成的空間浪費,在使用循環隊列處理假溢出時,主要有三種解決方案
本文提供后兩種解決方案。
順序隊和循環隊列是一種特殊的線性表,與順序棧類似,都是使用一組地址連續的存儲單元依次存放自隊頭到隊尾的數據元素,同時附設隊頭(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語言作為出現比較晚的一門編程語言,在其原生支持高并發、云原生等領域的優秀表現,像目前比較流行的容器編排技術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。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯