本文目錄一覽:
- 1、go語言中數組使用的注意事項和細節
- 2、golang – channel
- 3、利用go語言實現求數組交集的演算法
- 4、go語言的多維數組怎麼寫
- 5、golang中數組和slice作為參數的區別
- 6、Golang 中數組(Array)和切片(Slice)的區別
go語言中數組使用的注意事項和細節
1、數組是多個 相同類型 的數據的組合,一個數組一旦聲明/定義了,其 長度是固定的,不能動態變化 。
2、var arr []int 這時arr就是一個slice 切片 。
3、數組中的元素可以是任何數據類型,包括值類型和引用類型,但是 不能混用 。
4、數組創建後,如果沒有賦值,有默認值如下:
數值類型數組: 默認值為 0
字元串數組: 默認值為 “”
bool數組: 默認值為 false
5、使用數組的步驟:
(1)聲明數組並開闢空間
(3)給數組各個元素賦值
(3)使用數組
6、數組的下標是從0開始的。
7、數組下標必須在指定範圍內使用,否則報panic:數組越界,比如var arr [5]int的有效下標為0~4.
8、Go的數組屬於 值類型 ,在默認情況下是 值傳遞 ,因此會進行值拷貝。 數組間不會相互影響。
9、如想在其他函數中去修改原來的數組,可以使用 引用傳遞 (指針方式)。
10、長度是數組類型的一部分,在傳遞函數參數時,需要考慮數組的長度,看以下案例:
題1:編譯錯誤,因為不能把[3]int類型傳遞給[]int類型,前者是數組,後者是切片;
題2:編譯錯誤,因為不能把[3]int類型傳遞給[4]int類型;
題3:編譯正確,因為[3]int類型傳給[3]int類型合法。
golang – channel
通過var聲明或者make函數創建的channel變數是一個存儲在函數棧幀上的指針,佔用8個位元組,指向堆上的hchan結構體
源碼包中src/runtime/chan.go定義了hchan的數據結構如下:
hchan結構體的主要組成部分有四個:
用來保存goroutine之間傳遞數據的循環數組:buf
用來記錄此循環數組當前發送或接收數據的下標值:sendx和recvx
用於保存向該chan發送和從該chan接收數據被阻塞的goroutine隊列: sendq 和 recvq
保證channel寫入和讀取數據時線程安全的鎖:lock
環形數組作為channel 的緩衝區 數組的長度就是定義channnel 時channel 的緩衝大小
在hchan 中包括了讀/寫 等待隊列, waitq是一個雙向隊列,包括了一個頭結點和尾節點。 每個節點是一個sudog結構體變數
channel有2種類型:無緩衝、有緩衝, 在創建時 make(chan type cap) 通過cap 設定緩衝大小
channel有3種模式:寫操作模式(單向通道)、讀操作模式(單向通道)、讀寫操作模式(雙向通道)
channel有3種狀態:未初始化、正常、關閉
如下幾種狀態會引發panic
channel 是線程安全的,channel的底層實現中,hchan結構體中採用Mutex鎖來保證數據讀寫安全。在對循環數組buf中的數據進行入隊和出隊操作時,必須先獲取互斥鎖,才能操作channel數據
利用go語言實現求數組交集的演算法
題目: 給定兩個數組,編寫一個函數來計算它們的交集.(來自 leecode(349) )
示例 1:
輸入:nums1 = [1,2,2,1], nums2 = [2,2] 輸出:[2] 示例 2:
輸入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 輸出:[9,4]
說明:
我的解法:
題目同上,只不過在輸出的時候
輸出結果中每個元素出現的次數,應與元素在兩個數組中出現的次數一致。
示例 1:
輸入:nums1 = [1,2,2,1], nums2 = [2,2] 輸出:[2,2] 示例 2:
輸入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 輸出:[9,4]
解法
如果給定的數組是排好序的,
arr1 = [1,2,3,4,4,13],arr2 = [1,2,3,9,10]
那這個返回值該如何獲取得兩個數組的交集呢?
解法
go語言的多維數組怎麼寫
package main
import “fmt”
var arr [2]int //申明一個數組
func main() {
arr[0] = 1 //數組賦值
fmt.Println(arr)
arrtest := [3]int{1, 2, 3} //數組的另一種申明方式
fmt.Println(arrtest)
a := […]int{1, 2} //[…]自動識別數組的長度
fmt.Println(a)
fmt.Println(len(a))//輸出數組的長度
}
下邊是slice的申明和使用其實這就是一種動態的數組
複製代碼 代碼如下:
package main
import “fmt”
func main() {
d := []int{1, 2, 3} //申明一個slice這個是動態的數組,沒有長度
fmt.Println(d)
var q, w []int
q = d[0:1] //可以定取得上邊的長度
w = d[1:3]
d = append(d, 2) //向其中添加元素
fmt.Println(d)
fmt.Println(q, w)
}
golang中數組和slice作為參數的區別
最主要的區別是:slice支持負數的下標(代表從字元串結尾開始算位置),substring不支持
substring() 方法用於提取字元串中介於兩個指定下標之間的字元。主要用於字元串截取
stringObject.substring(start,stop)
start:必需。一個非負的整數,規定要提取的子串的第一個字元在 stringObject 中的位置。
end:可選。一個非負的整數,比要提取的子串的最後一個字元在 stringObject 中的位置多 1。
如果省略該參數,那麼返回的子串會一直到字元串的結尾。
例如:”abcdefg”.substring(3,5)返回de,字元串的第3個字元是d(從0開始,即a是第0個字元),截取到第5個字元前(不包括第5個)
與 slice()方法不同的是,substring() 不接受負的參數。
slice() 方法可提取字元串的某個部分,並以新的字元串返回被提取的部分。
stringObject.slice(start,end)
start:要抽取的片斷的起始下標。如果是負數,則該參數規定的是從字元串的尾部開始算起的位置。也就是說,-1 指字元串的最後一個字元,-2 指倒數第二個字元,以此類推。
end:緊接著要抽取的片段的結尾的下標。若未指定此參數,則要提取的子串包括 start 到原字元串結尾的字元串。如果該參數是負數,那麼它規定的是從字元串的尾部開始算起的位置。
slice() 比 substring() 要靈活一些,因為它允許使用負數作為參數。
Golang 中數組(Array)和切片(Slice)的區別
Go 中數組的長度是不可改變的,而 Slice 解決的就是對不定長數組的需求。他們的區別主要有兩點。
數組:
切片:
注意 1
雖然數組在初始化時也可以不指定長度,但 Go 語言會根據數組中元素個數自動設置數組長度,並且不可改變。切片通過 append 方法增加元素:
如果將 append 用在數組上,你將會收到報錯:first argument to append must be slice。
注意 2
切片不只有長度(len)的概念,同時還有容量(cap)的概念。因此切片其實還有一個指定長度和容量的初始化方式:
這就初始化了一個長度為3,容量為5的切片。
此外,切片還可以從一個數組中初始化(可應用於如何將數組轉換成切片):
上述例子通過數組 a 初始化了一個切片 s。
當切片和數組作為參數在函數(func)中傳遞時,數組傳遞的是值,而切片傳遞的是指針。因此當傳入的切片在函數中被改變時,函數外的切片也會同時改變。相同的情況,函數外的數組則不會發生任何變化。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/247997.html