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

go語言深度解析 go語言比較

講講go語言的結構體

作為C語言家族的一員,go和c一樣也支持結構體。可以類比于java的一個POJO。

創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供亳州網(wǎng)站建設、亳州做網(wǎng)站、亳州網(wǎng)站設計、亳州網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、亳州企業(yè)網(wǎng)站模板建站服務,十多年亳州做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。

在學習定義結構體之前,先學習下定義一個新類型。

新類型 T1 是基于 Go 原生類型 int 定義的新自定義類型,而新類型 T2 則是 基于剛剛定義的類型 T1,定義的新類型。

這里要引入一個底層類型的概念。

如果一個新類型是基于某個 Go 原生類型定義的, 那么我們就叫 Go 原生類型為新類型的底層類型

在上面的例子中,int就是T1的底層類型。

但是T1不是T2的底層類型,只有原生類型才可以作為底層類型,所以T2的底層類型還是int

底層類型是很重要的,因為對兩個變量進行顯式的類型轉換,只有底層類型相同的變量間才能相互轉換。底層類型是判斷兩個類型本質上是否相同的根本。

這種類型定義方式通常用在 項目的漸進式重構,還有對已有包的二次封裝方面

類型別名表示新類型和原類型完全等價,實際上就是同一種類型。只不過名字不同而已。

一般我們都是定義一個有名的結構體。

字段名的大小寫決定了字段是否包外可用。只有大寫的字段可以被包外引用。

還有一個點提一下

如果換行來寫

Age: 66,后面這個都好不能省略

還有一個點,觀察e3的賦值

new返回的是一個指針。然后指針可以直接點號賦值。這說明go默認進行了取值操作

e3.Age 等價于 (*e3).Age

如上定義了一個空的結構體Empty。打印了元素e的內(nèi)存大小是0。

有什么用呢?

基于空結構體類型內(nèi)存零開銷這樣的特性,我們在日常 Go 開發(fā)中會經(jīng)常使用空 結構體類型元素,作為一種“事件”信息進行 Goroutine 之間的通信

這種以空結構體為元素類建立的 channel,是目前能實現(xiàn)的、內(nèi)存占用最小的 Goroutine 間通信方式。

這種形式需要說的是幾個語法糖。

語法糖1:

對于結構體字段,可以省略字段名,只寫結構體名。默認字段名就是結構體名

這種方式稱為 嵌入字段

語法糖2:

如果是以嵌入字段形式寫的結構體

可以省略嵌入的Reader字段,而直接訪問ReaderName

此時book是一個各個屬性全是對應類型零值的一個實例。不是nil。這種情況在Go中稱為零值可用。不像java會導致npe

結構體定義時可以在字段后面追加標簽說明。

tag的格式為反單引號

tag的作用是可以使用[反射]來檢視字段的標簽信息。

具體的作用還要看使用的場景。

比如這里的tag是為了幫助 encoding/json 標準包在解析對象時可以利用的規(guī)則。比如omitempty表示該字段沒有值就不打印出來。

go分析要多久

Go語言的分析取決于多方面的因素,如代碼量、理解深度、復雜性等。如果是一般的小規(guī)模項目,比如幾百行代碼,那么通常需要幾個小時來分析。但對于大規(guī)模項目,比如幾萬行以上,則需要更多的時間來分析,可能會有幾天或更長的時間。同時,如果開發(fā)者對代碼深入理解的程度越高,分析的時間也會更長。

Go語言——goroutine并發(fā)模型

參考:

Goroutine并發(fā)調(diào)度模型深度解析手擼一個協(xié)程池

Golang 的 goroutine 是如何實現(xiàn)的?

Golang - 調(diào)度剖析【第二部分】

OS線程初始棧為2MB。Go語言中,每個goroutine采用動態(tài)擴容方式,初始2KB,按需增長,最大1G。此外GC會收縮棧空間。

BTW,增長擴容都是有代價的,需要copy數(shù)據(jù)到新的stack,所以初始2KB可能有些性能問題。

更多關于stack的內(nèi)容,可以參見大佬的文章。 聊一聊goroutine stack

用戶線程的調(diào)度以及生命周期管理都是用戶層面,Go語言自己實現(xiàn)的,不借助OS系統(tǒng)調(diào)用,減少系統(tǒng)資源消耗。

Go語言采用兩級線程模型,即用戶線程與內(nèi)核線程KSE(kernel scheduling entity)是M:N的。最終goroutine還是會交給OS線程執(zhí)行,但是需要一個中介,提供上下文。這就是G-M-P模型

Go調(diào)度器有兩個不同的運行隊列:

go1.10\src\runtime\runtime2.go

Go調(diào)度器根據(jù)事件進行上下文切換。

調(diào)度的目的就是防止M堵塞,空閑,系統(tǒng)進程切換。

詳見 Golang - 調(diào)度剖析【第二部分】

Linux可以通過epoll實現(xiàn)網(wǎng)絡調(diào)用,統(tǒng)稱網(wǎng)絡輪詢器N(Net Poller)。

文件IO操作

上面都是防止M堵塞,任務竊取是防止M空閑

每個M都有一個特殊的G,g0。用于執(zhí)行調(diào)度,gc,棧管理等任務,所以g0的棧稱為調(diào)度棧。g0的棧不會自動增長,不會被gc,來自os線程的棧。

go1.10\src\runtime\proc.go

G沒辦法自己運行,必須通過M運行

M通過通過調(diào)度,執(zhí)行G

從M掛載P的runq中找到G,執(zhí)行G

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

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

數(shù)組簡單描述就由相同類型元素組成的數(shù)據(jù)結構, 在創(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ù)組的大小進行推導,只是Go提供的一種語法糖。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

也可以通過地址構造切片

nil切片:指的unsafe.Pointer 為nil

空切片:

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

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

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

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

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

Go語言有什么優(yōu)勢?

GO語言的優(yōu)勢:可直接編譯成機器碼,不依賴其他庫,glibc的版本有一定要求,部署就是扔一個文件上去就完成了。靜態(tài)類型語言,但是有動態(tài)語言的感覺,靜態(tài)類型的語言就是可以在編譯的時候檢查出來隱藏的大多數(shù)問題,動態(tài)語言的感覺就是有很多的包可以使用,寫起來的效率很高。語言層面支持并發(fā),這個就是Go最大的特色,天生的支持并發(fā),我曾經(jīng)說過一句話,天生的基因和整容是有區(qū)別的,大家一樣美麗,但是你喜歡整容的還是天生基因的美麗呢?Go就是基因里面支持的并發(fā),可以充分的利用多核,很容易的使用并發(fā)。內(nèi)置runtime,支持垃圾回收,這屬于動態(tài)語言的特性之一吧,雖然目前來說GC不算完美,但是足以應付我們所能遇到的大多數(shù)情況,特別是Go1.1之后的GC。簡單易學,Go語言的作者都有C的基因,那么Go自然而然就有了C的基因,那么Go關鍵字是25個,但是表達能力很強大,幾乎支持大多數(shù)你在其他語言見過的特性:繼承、重載、對象等。豐富的標準庫,Go目前已經(jīng)內(nèi)置了大量的庫,特別是網(wǎng)絡庫非常強大,我最愛的也是這部分。內(nèi)置強大的工具,Go語言里面內(nèi)置了很多工具鏈,最好的應該是gofmt工具,自動化格式化代碼,能夠讓團隊review變得如此的簡單,代碼格式一模一樣,想不一樣都很困難。跨平臺編譯,如果你寫的Go代碼不包含cgo,那么就可以做到window系統(tǒng)編譯linux的應用,如何做到的呢?Go引用了plan9的代碼,這就是不依賴系統(tǒng)的信息。Go語言這么多的優(yōu)勢,你還不想學嗎?我記得當時我看的是黑馬程序員的視頻,我對他們視頻的印象就是通俗易懂,就是好!

文章名稱:go語言深度解析 go語言比較
網(wǎng)頁鏈接:http://www.2m8n56k.cn/article20/docpojo.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站域名注冊軟件開發(fā)標簽優(yōu)化網(wǎng)站改版商城網(wǎng)站

廣告

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

外貿(mào)網(wǎng)站制作
主站蜘蛛池模板: 成人a毛片高清视频 | 国产年成美女网站视频免费看 | 制服丝袜在线视频香蕉 | 真人一级毛片国产 | 久久不卡日韩美女 | 国产午夜一级淫片 | 国产精品9| 日韩美女一级视频 | 国产成人一级 | 国产欧美日本在线观看 | 成人牲交一极毛片 | 日韩毛片一级 | 大学生一级一片第一次免费 | 日韩一区国产二区欧美三 | 手机国产日韩高清免费看片 | 国产精品自在自线亚洲 | 日韩欧美精品一区二区三区 | 日韩一区精品 | 亚洲综合成人网在线观看 | 亚洲一区免费在线观看 | 亚洲国产成人精彩精品 | 看国产一级毛片 | 国产亚洲人成在线影院 | 亚洲加勒比久久88色综合一区 | 国产成人精品视频播放 | 毛片亚洲毛片亚洲毛片 | 黄色一级毛片免费 | 91原创视频在线观看 | 成年人黄页 | 成人免费看 | 欧美高清在线精品一区二区不卡 | 亲子乱子伦xxxx | 真实国产普通话对白乱子子伦视频 | 亚洲国产精品日韩高清秒播 | 欧美日韩在线视频免费完整 | 久久成人福利视频 | 成人国产精品一级毛片视频 | 99视频网址| 免费一区二区三区四区五区 | 日本精品一区二区三区在线视频 | 在线成人天天鲁夜啪视频 |