亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Golang學(xué)習(xí)筆記(四):array、slice、map

 更新時間:2015年05月09日 11:44:37   投稿:junjie  
這篇文章主要介紹了Golang學(xué)習(xí)筆記(四):array、slice、map,本文分別講解了這3個類型的聲明&賦值、元素訪問、其它操作,需要的朋友可以參考下

一.Array

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

所有的值類型變量在賦值和作為參數(shù)傳遞時都將產(chǎn)生一個復(fù)制動作

如果作為函數(shù)的參數(shù)類型,則在函數(shù)調(diào)用時參數(shù)發(fā)生數(shù)據(jù)復(fù)制,在函數(shù)體中無法修改傳入數(shù)組的內(nèi)容

數(shù)組相等用 = != 比較,不能用 < >

1.聲明&賦值

初始化

語法

復(fù)制代碼 代碼如下:

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} //自動推斷

二維數(shù)組

復(fù)制代碼 代碼如下:

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] 前者可推斷,但是后者必須顯示賦值
數(shù)組的長度是該數(shù)組類型的一個內(nèi)置常量

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

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

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

2.元素訪問

復(fù)制代碼 代碼如下:

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

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


可以用new創(chuàng)建數(shù)組
復(fù)制代碼 代碼如下:

p := new([10]int)

返回一個指向數(shù)組的指針
注意區(qū)分

指向數(shù)組的指針

復(fù)制代碼 代碼如下:

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

指針數(shù)組
復(fù)制代碼 代碼如下:

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

二.Slice

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

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

slice就像一個結(jié)構(gòu)體,包含三個元素

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

通過array創(chuàng)建

復(fù)制代碼 代碼如下:

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:]


從數(shù)組或已存在的slice再次聲明
復(fù)制代碼 代碼如下:

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]


直接創(chuàng)建
復(fù)制代碼 代碼如下:

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

2.元素訪問

復(fù)制代碼 代碼如下:

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的最大容量

動態(tài)增減元素

復(fù)制代碼 代碼如下:

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

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

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

內(nèi)容復(fù)制

復(fù)制代碼 代碼如下:

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

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

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

切片

復(fù)制代碼 代碼如下:

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

slice是引用類型,所以當(dāng)改變其中元素的時候,其他的所有引用都會改變
復(fù)制代碼 代碼如下:

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

三.Map

Python中字典的概念

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

1.聲明&賦值

復(fù)制代碼 代碼如下:

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.元素訪問

復(fù)制代碼 代碼如下:

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.基本操作

賦值

復(fù)制代碼 代碼如下:

m["1234"] = PersonInfo{}

刪除
復(fù)制代碼 代碼如下:

delete(m, "1234")

四.其他

make和new操作

復(fù)制代碼 代碼如下:

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

new用于各種類型的內(nèi)存分配

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

make(T, args),只能創(chuàng)建slice,map,channel,并返回一個有初始值(非零值)的T類型,而不是*T。 本質(zhì)來講,導(dǎo)致這三個類型有所不同的原因是,指向數(shù)據(jù)結(jié)構(gòu)的引用在使用前必須被初始化

相關(guān)文章

  • Go語言基礎(chǔ)知識總結(jié)(語法、變量、數(shù)值類型、表達式、控制結(jié)構(gòu)等)

    Go語言基礎(chǔ)知識總結(jié)(語法、變量、數(shù)值類型、表達式、控制結(jié)構(gòu)等)

    這篇文章主要介紹了Go語言基礎(chǔ)知識總結(jié)(語法、變量、數(shù)值類型、表達式、控制結(jié)構(gòu)等),本文匯總了Go語言的入門知識,需要的朋友可以參考下
    2014-10-10
  • golang解析html網(wǎng)頁的方法

    golang解析html網(wǎng)頁的方法

    今天小編就為大家分享一篇golang解析html網(wǎng)頁的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • golang基礎(chǔ)之Interface接口的使用

    golang基礎(chǔ)之Interface接口的使用

    這篇文章主要介紹了golang基礎(chǔ)之Interface接口的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • 一文帶你了解Go中的內(nèi)存對齊

    一文帶你了解Go中的內(nèi)存對齊

    一旦涉及到較為底層的編程,特別是與硬件交互,內(nèi)存對齊是一個必修的課題,所以這篇文章小編就想來和大家聊一聊Go語言中的內(nèi)存對齊,希望對大家有所幫助
    2023-10-10
  • 一文掌握Go語言并發(fā)編程必備的Mutex互斥鎖

    一文掌握Go語言并發(fā)編程必備的Mutex互斥鎖

    Go 語言提供了 sync 包,其中包括 Mutex 互斥鎖、RWMutex 讀寫鎖等同步機制,本篇博客將著重介紹 Mutex 互斥鎖的基本原理,需要的可以參考一下
    2023-04-04
  • go語言接口的定義和實現(xiàn)簡單分享

    go語言接口的定義和實現(xiàn)簡單分享

    這篇文章主要介紹了go語言接口的定義和實現(xiàn)簡單分享的相關(guān)資料,需要的朋友可以參考下
    2023-08-08
  • 一文詳解golang延時任務(wù)的實現(xiàn)

    一文詳解golang延時任務(wù)的實現(xiàn)

    這篇文章主要為大家介紹了golang延時任務(wù)的實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Golang依賴注入工具digo的使用詳解

    Golang依賴注入工具digo的使用詳解

    這篇文章主要為大家詳細介紹了Golang中依賴注入工具digo的使用,文中的示例代碼講解詳細,具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-06-06
  • 源碼分析Golang?log是如何實現(xiàn)的

    源碼分析Golang?log是如何實現(xiàn)的

    go語言的log包提供了簡單的日志記錄功能,允許開發(fā)者在應(yīng)用程序中記錄重要的信息、錯誤、警告等,log包是Go標(biāo)準(zhǔn)庫的一部分,因此,使用它不需要安裝額外的第三方庫,本文給大家源碼分析了Golang?log是如何實現(xiàn)的,需要的朋友可以參考下
    2024-03-03
  • Golang中 Slice的分析與使用源碼解析

    Golang中 Slice的分析與使用源碼解析

    這篇文章主要介紹了Golang 中 Slice的分析與使用(含源碼),本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03

最新評論