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

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. 切片的大小和容量是否足夠小;

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

切片有一個數組的指針,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://www.2m8n56k.cn/article44/hceche.html

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

廣告

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

網站優化排名
主站蜘蛛池模板: 欧美很黄视频在线观看 | 欧美成人在线影院 | 成人久久18免费游戏网站 | 国产午夜精品久久久久免费视 | 久久久久欧美国产精品 | 九九精品激情在线视频 | 国产日产精品_国产精品毛片 | 日本三级香港三级人妇99视 | 国产精品亚洲四区在线观看 | 日本三级视频在线 | 国产成人一区二区在线不卡 | 真人一级毛片免费观看视频 | 亚洲美色综合天天久久综合精品 | 亚洲国产系列 | 一区二区三区视频网站 | 久久精品午夜视频 | 国产特黄一级一片免费 | 欧美亚洲黄色 | 成人午夜大片 | 亚洲精品国产一区二区三 | 顶级毛片在线手机免费看 | 欧美精品国产精品 | 国产主播精品福利19禁vip | 欧美一级亚洲一级 | 欧美成人亚洲国产精品 | 国产一级毛片大陆 | 国产日本在线视频 | 成年人免费视频观看 | 国产精品爱久久久久久久 | 久久国产三级 | 99久久精品国产亚洲 | 国内主播福利视频在线观看 | 免费国产成人 | 久久久久无码国产精品一区 | 一级特级毛片免费 | 国产一级片毛片 | 国产在线精品福利一区二区三区 | 欧美日韩中文国产一区二区三区 | 欧美69视频 | 有码 在线| 色悠久久久久综合网伊人男男 |