真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

go語言cap的意思 go語言grpc

golang變量(二)——map和slice詳解

衍生類型,interface{} , map, [] ,struct等

創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站設(shè)計、成都網(wǎng)站制作與策劃設(shè)計,宜豐網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:宜豐等地區(qū)。宜豐做網(wǎng)站價格咨詢:18980820575

map類似于java的hashmap,python的dict,php的hash array。

常規(guī)的for循環(huán),可以用for k,v :=range m {}. 但在下面清空有一個坑注意:

著名的map[string]*struct 副本問題

結(jié)果:

Go 中不存在引用傳遞,所有的參數(shù)傳遞都是值傳遞,而map是等同于指針類型的,所以在把map變量傳遞給函數(shù)時,函數(shù)對map的修改,也會實質(zhì)改變map的值。

slice類似于其他語言的數(shù)組(list,array),slice初始化和map一樣,這里不在重復(fù)

除了Pointer數(shù)組外,len表示使用長度,cap是總?cè)萘?,make([]int, len, cap)可以預(yù)申請 比較大的容量,這樣可以減少容量拓展的消耗,前提是要用到。

cap是計算切片容量,len是計算變量長度的,兩者不一樣。具體例子如下:

結(jié)果:

分析:cap是計算當(dāng)前slice已分配的容量大小,采用的是預(yù)分配的伙伴算法(當(dāng)容量滿時,拓展分配一倍的容量)。

append是slice非常常用的函數(shù),用于添加數(shù)據(jù)到slice中,但如果使用不好,會有下面的問題:

預(yù)期是[1 2 3 4 5 6 7 8 9 10], [1 2 3 4 5 6 7 8 9 10 11 12],但實際結(jié)果是:

注意slice是值傳遞,修改一下:

輸出如下:

== 只能用于判斷常規(guī)數(shù)據(jù)類型,無法使用用于slice和map判斷,用于判斷map和slice可以使用reflect.DeepEqual,這個函數(shù)用了遞歸來判斷每層的k,v是否一致。

當(dāng)然還有其他方式,比如轉(zhuǎn)換成json,但小心有一些異常的bug,比如html編碼,具體這個json問題,待后面在分析。

Go切片數(shù)組深度解析

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

數(shù)組簡單描述就由相同類型元素組成的數(shù)據(jù)結(jié)構(gòu), 在創(chuàng)建初期就確定了長度,是不可變的。

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

Go 語言的數(shù)組有兩種不同的創(chuàng)建方式,一種是顯示的初始化,一種是隱式的初始化。

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

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

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

編譯器對數(shù)組函數(shù)中做兩種不同的優(yōu)化:

在靜態(tài)區(qū)完成賦值后復(fù)制到棧中。

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

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

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

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

同樣的我們將數(shù)組轉(zhuǎn)換為切片,通過傳遞切片,地址是不一樣的,數(shù)組值相同。

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

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

通過這種方式可以將數(shù)組轉(zhuǎn)換為切片。

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

使用make創(chuàng)建切片,就不光編譯期了,make創(chuàng)建切片會涉及到運行期。1. 切片的大小和容量是否足夠??;

切片是否發(fā)生了逃逸,最終在堆上初始化。如果切片小的話會先在?;蜢o態(tài)區(qū)進行創(chuàng)建。

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

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

發(fā)現(xiàn)切片的結(jié)構(gòu)體是數(shù)組的地址指針array unsafe.Pointer,而Go中數(shù)組的地址代表數(shù)組結(jié)構(gòu)體的地址。

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

也可以通過地址構(gòu)造切片

nil切片:指的unsafe.Pointer 為nil

空切片:

創(chuàng)建的指針不為空,len和cap為空

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

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

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

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

cap帽子英語怎么念

cap帽子英語讀音:英[k?p]美 [k?p]。

cap

英 [k?p]     美 [k?p]    

n.帽子;蓋子;頂;上限;vt.超過;加蓋于;戴帽;覆蓋;完成;設(shè)限;vi.脫帽致意。

It's better to put the cap back on the bottle.

最好把瓶蓋蓋上。

This speech caps a month of canvassing.

這場演講結(jié)束了一個月來的游說。

語法

cap的基本意思是“帽子”,多指無邊有舌的“便帽”,也指制服帽,表示地位、職業(yè)、所屬俱樂部或球隊等的帽子或是任何一種緊蓋住頭部的帽子,是可數(shù)名詞。

cap可用于比喻義,可指“保護蓋〔套〕”。cap的基本意思是“覆蓋”“籠罩”,引申可表示“勝過”“超過”,相當(dāng)于漢語俗語中的“蓋了帽了”。


網(wǎng)站題目:go語言cap的意思 go語言grpc
網(wǎng)站URL:http://weahome.cn/article/ddogeci.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部