中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang中的array和slice以及map是怎樣的

發布時間:2021-09-17 15:44:26 來源:億速云 閱讀:155 作者:柒染 欄目:編程語言

這篇文章將為大家詳細講解有關Golang中的array和slice以及map是怎樣的,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

一.Array

在Go語言中,數組是一個值類型(value type)

所有的值類型變量在賦值和作為參數傳遞時都將產生一個復制動作

如果作為函數的參數類型,則在函數調用時參數發生數據復制,在函數體中無法修改傳入數組的內容

數組相等用 = != 比較,不能用 < >

1.聲明&賦值

初始化

語法

復制代碼 代碼如下:


var VarName [n]type     // n>=0

e.g.
var a [5]int //[0 0 0 0 0]
var c [2][3]int //二維

var b int = [5]int{1,2,3,4,5} //聲明并初始化

a := [3]int{1,2,3}
b := [10]int{1,2,3} //前三個元素,其他為0
c := [20]int{19:1} //第20個元素初始化為1,其他默認0
d := [...]int{4,5,6} //自動計算長度
e := [...]int{0:1, 1:2, 19:3} //自動推斷

二維數組

復制代碼 代碼如下:


doubleArray := [2][4]int{[4]int{1,2,3,4}, [4]int{5,6,7,8}}
easyArray := [2][4]int{{1,2,3,4}, {1,2,3,4}}


多維 [...][n] 前者可推斷,但是后者必須顯示賦值
數組的長度是該數組類型的一個內置常量

arrLength := len(arr)
注意,數組長度也是類型的一部分,因此不同長度數組為不同類型(內置常量)

即[3]int和[4]int是不同類型,并且數組不能改變長度

數組之間的賦值是值的賦值,即當把一個數組作為參數傳入函數的時候,傳入的其實是該數組的副本(一次復制操作),而不是它的指針,如果要傳入指針,使用slice

2.元素訪問

復制代碼 代碼如下:


for i:=0; i < len(array); i++ {
    fmt.Println(i, array[i])
}

for i, v := range array {
    fmt.Println(i, v)
}

可以用new創建數組

復制代碼 代碼如下:


p := new([10]int)


返回一個指向數組的指針
注意區分

指向數組的指針

復制代碼 代碼如下:


a := [100]int{}
var p *[100]int = &a


指針數組

復制代碼 代碼如下:


x, y = 1, 2
a := [...]*int{&x, &y}

二.Slice

數組切片就像一個指向數組的指針,但更復雜,實際上它擁有自己的數據結構,而不僅僅是指針(指向原生數組的指針 + 數組切片中元素個數 + 數組切片已分配的存儲空間)

一個引用類型,總是指向一個底層array,聲明可以向array一樣,只是不需要長度

slice就像一個結構體,包含三個元素

一個指針,指向數組中slice指定的開始位置
長度,即slice的長度
最大長度,也就是slice開始位置到數組的最后位置的長度
1.聲明&賦值

通過array創建

復制代碼 代碼如下:


var myArray [10]int = [10]int{1,2,3,4,5,6,7,8,9,10}
var mySlice []int = myArray[:5]

a := [5]int{1,2,3,4,5}
b := a[2:4]
b := a[:4]
b := a[2:]

從數組或已存在的slice再次聲明

復制代碼 代碼如下:


var ar [10]byte {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'}

var a, b []byte
a = ar[2:5]
b = ar[3:5]

直接創建

復制代碼 代碼如下:


myslice1 := make([]int, 5)
myslice2 := make([]int, 5, 10) //初始個數5,預留10個元素的存儲空間
myslice3 := []int{1,2,3,4,5}

2.元素訪問

復制代碼 代碼如下:


for i:=0; i<len(mySlice); i++ {
    fmt.Println(i, mySlice[i])
}

for i, v := range mySlice {
    fmt.Println(i, v)
}

3.其他操作

大小和容量

len獲取slice的長度
cap獲取slice的最大容量

動態增減元素

復制代碼 代碼如下:


append想slice里面追加一個或者多個元素,然后返回一個和slice一樣類型的slice

//append
mySlice = append(mySlice, 1, 2, 3) //增加三個元素
mySlice = append(mySlice, mySlice2) //增加另一個

注意,append會改變slice所引用的數組的內容,從而影響到引用統一數組的其他slice,
     但當slice中沒有剩余空間,此時動態分配新的數組空間返回的slice數組指針將指向這個空間,
     而原數組的內容將保持不變,其他引用此數組的slice不受影響(坑,可能引入bug)

內容復制

復制代碼 代碼如下:


copy,從源slice的src中復制到目標dst,并且返回復制元素的個數
copy(dst, source) //會按短的個數復制

slice1 := []int{1,2,3,4,5}
slice2 := []int{5,4,3}

copy(slice2, slice1) //復制slice1前三個 1 -> 2
copy(slice1, slice2) //復制slice2的前三個 2 -> 1

切片

復制代碼 代碼如下:


默認開始位置0,ar[:n]等價于ar[0:n]
第二個序列默認是數組長度 ar[n:] 等價于 ar[n:len(ar)]
從一個數組直接獲取slice,可以是ar[:]


slice是引用類型,所以當改變其中元素的時候,其他的所有引用都會改變

復制代碼 代碼如下:


aSlice = array[3:7]
bslice = aSlice[:3]

三.Map

Python中字典的概念

map是無序的,長度不固定,內置的len可以用于map,可以方便的修改

1.聲明&賦值

復制代碼 代碼如下:


map[keyType]valueType

var m map[string] PersonInfo
m = make(map[string] personInfo[, 100])

var numbers map[string]int
or
numbers := make(map[string]int)
numbers["one"] = 1

初始化一個字典

2.元素訪問

復制代碼 代碼如下:


rating := map[string]float32 {"c":5, "Go":4.5}

csharpRating, ok := rating["C#"]
if ok {
    fmt.Println("get the value")
} else{
    fmt.Println("error")
}

3.基本操作

賦值

復制代碼 代碼如下:


m["1234"] = PersonInfo{}


刪除

復制代碼 代碼如下:


delete(m, "1234")

四.其他

make和new操作

復制代碼 代碼如下:


make用于內建類型(map,slice,channel) 的內存分配。

new用于各種類型的內存分配

new本質上和其他語言中同名函數一樣, new(T)分配了零值填充的T類型的內存空間,并返回其地址,即一個*T類型的值 即,返回一個指針,指向新分配的類型T的零值

make(T, args),只能創建slice,map,channel,并返回一個有初始值(非零值)的T類型,而不是*T。 本質來講,導致這三個類型有所不同的原因是,指向數據結構的引用在使用前必須被初始化

關于Golang中的array和slice以及map是怎樣的就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

仪征市| 荆门市| 华容县| 建平县| 福安市| 安阳县| 高唐县| 呼伦贝尔市| 全椒县| 霍州市| 越西县| 开封县| 芷江| 乃东县| 义乌市| 汉沽区| 鹿邑县| 杨浦区| 潜江市| 宝坻区| 文成县| 鄂州市| 融水| 河西区| 朝阳市| 南康市| 长沙市| 浦城县| 太仓市| 密山市| 时尚| 横山县| 仁布县| 揭西县| 钟祥市| 逊克县| 阳城县| 志丹县| 明溪县| 五台县| 兴安县|