中文字幕第五页-中文字幕第页-中文字幕韩国-中文字幕最新-国产尤物二区三区在线观看-国产尤物福利视频一区二区

go語言數組的用法,go語言結構體數組

go語言的多維數組怎么寫

package main

創新互聯公司自2013年創立以來,是專業互聯網技術服務公司,擁有項目網站設計、做網站網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元裕民做網站,已為上家服務,為裕民各地企業和個人服務,聯系電話:18982081108

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)

}

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類型合法。

Go切片數組深度解析

Go 中的分片數組,實際上有點類似于Java中的ArrayList,是一個可以擴展的數組,但是Go中的切片由比較靈活,它和數組很像,也是基于數組,所以在了解Go切片前我們先了解下數組。

數組簡單描述就由相同類型元素組成的數據結構, 在創建初期就確定了長度,是不可變的。

但是Go的數組類型又和C與Java的數組類型不一樣, NewArray 用于創建一個數組,從源碼中可以看出最后返回的是 Array{}的指針,并不是第一個元素的指針,在Go中數組屬于值類型,在進行傳遞時,采取的是值傳遞,通過拷貝整個數組。Go語言的數組是一種有序的struct。

Go 語言的數組有兩種不同的創建方式,一種是顯示的初始化,一種是隱式的初始化。

注意一定是使用 [...]T 進行創建,使用三個點的隱式創建,編譯器會對數組的大小進行推導,只是Go提供的一種語法糖。

其次,Go中數組的類型,是由數值類型和長度兩個一起確定的。[2]int 和 [3]int 不是同一個類型,不能進行傳參和比較,把數組理解為類型和長度兩個屬性的結構體,其實就一目了然了。

Go中的數組屬于值類型,通常應該存儲于棧中,局部變量依然會根據逃逸分析確定存儲棧還是堆中。

編譯器對數組函數中做兩種不同的優化:

在靜態區完成賦值后復制到棧中。

總結起來,在不考慮逃逸分析的情況下,如果數組中元素的個數小于或者等于 4 個,那么所有的變量會直接在棧上初始化,如果數組元素大于 4 個,變量就會在靜態存儲區初始化然后拷貝到棧上。

由于數組是值類型,那么賦值和函數傳參操作都會復制整個數組數據。

不管是賦值或函數傳參,地址都不一致,發生了拷貝。如果數組的數據較大,則會消耗掉大量內存。那么為了減少拷貝我們可以主動的傳遞指針呀。

地址是一樣的,不過傳指針會有一個弊端,從打印結果可以看到,指針地址都是同一個,萬一原數組的指針指向更改了,那么函數里面的指針指向都會跟著更改。

同樣的我們將數組轉換為切片,通過傳遞切片,地址是不一樣的,數組值相同。

切片是引用傳遞,所以它們不需要使用額外的內存并且比使用數組更有效率。

所以,切片屬于引用類型。

通過這種方式可以將數組轉換為切片。

中間不加三個點就是切片,使用這種方式創建切片,實際上是先創建數組,然后再通過第一種方式創建。

使用make創建切片,就不光編譯期了,make創建切片會涉及到運行期。1. 切片的大小和容量是否足夠?。?/p>

切片是否發生了逃逸,最終在堆上初始化。如果切片小的話會先在棧或靜態區進行創建。

切片有一個數組的指針,len是指切片的長度, cap指的是切片的容量。

cap是在初始化切片是生成的容量。

發現切片的結構體是數組的地址指針array unsafe.Pointer,而Go中數組的地址代表數組結構體的地址。

slice 中得到一塊內存地址,array[0]或者unsafe.Pointer(array[0])。

也可以通過地址構造切片

nil切片:指的unsafe.Pointer 為nil

空切片:

創建的指針不為空,len和cap為空

當一個切片的容量滿了,就需要擴容了。怎么擴,策略是什么?

如果原來數組切片的容量已經達到了最大值,再想擴容, Go 默認會先開一片內存區域,把原來的值拷貝過來,然后再執行 append() 操作。這種情況對現數組的地址和原數組地址不相同。

從上面結果我們可以看到,如果用 range 的方式去遍歷一個切片,拿到的 Value 其實是切片里面的值拷貝,即淺拷貝。所以每次打印 Value 的地址都不變。

由于 Value 是值拷貝的,并非引用傳遞,所以直接改 Value 是達不到更改原切片值的目的的,需要通過 slice[index] 獲取真實的地址。

網站欄目:go語言數組的用法,go語言結構體數組
文章位置:http://m.2m8n56k.cn/article44/hceche.html

成都網站建設公司_創新互聯,為您提供定制開發營銷型網站建設、網頁設計公司、小程序開發企業網站制作、企業建站

廣告

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

網站優化排名
主站蜘蛛池模板: 中文字幕亚洲一区二区va在线 | 国产视频久久久 | 亚洲国产高清在线 | 国产a级特黄的片子视频免费 | 欧美日韩一区二区视频免费看 | 免费一级a毛片 | 久久精品视频在线观看 | 成人免费手机在线看网站 | 国产成人精品免费视频 | a级特黄毛片免费观看 | 在线天天干 | 日本伊人精品一区二区三区 | 国产九九精品视频 | 成年人黄色免费网站 | 欧美久久视频 | 亚洲日本aⅴ片在线观看香蕉 | 国产欧美日韩综合二区三区 | 欧美日韩在线播放一区二区三区 | 97在线观看免费版 | 另类女最新视频 | 国内自拍视频在线看免费观看 | 国产一级性片 | 韩国日本一级片 | 欧美一级片在线观看 | 国产精品九九视频 | 国产美女精品视频免费观看 | 精品无码三级在线观看视频 | 国产一区在线看 | 特黄视频 | 国产日本韩国不卡在线视频 | 国产欧美一区二区另类精品 | 亚欧色视频在线观看免费 | 91原创视频在线观看 | 成人国产亚洲欧美成人综合网 | 国产一级特黄aa级特黄裸毛片 | 三级黄网 | 国产日产欧产精品精品推荐小说 | 国产精品亚洲综合久久 | 自拍在线视频 | 美女性视频网站 | 网站在线看 |