go語言代碼記知識點 go語言代碼生成器

《Go語言學(xué)習(xí)筆記》epub下載在線閱讀全文,求百度網(wǎng)盤云資源

《Go語言學(xué)習(xí)筆記》(雨痕)電子書網(wǎng)盤下載免費在線閱讀

成都創(chuàng)新互聯(lián)公司一直秉承“誠信做人,踏實做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務(wù)為基礎(chǔ),以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個客戶多一個朋友!為您提供做網(wǎng)站、網(wǎng)站建設(shè)、成都網(wǎng)頁設(shè)計、微信平臺小程序開發(fā)、成都網(wǎng)站開發(fā)、成都網(wǎng)站制作、成都軟件開發(fā)、重慶APP軟件開發(fā)是成都本地專業(yè)的網(wǎng)站建設(shè)和網(wǎng)站設(shè)計公司,等你一起來見證!

鏈接:

提取碼:qyzq ?

書名:Go語言學(xué)習(xí)筆記

豆瓣評分:8.1

作者:?雨痕

出版社:?電子工業(yè)出版社

出品方:?博文視點

出版年:?2016-6

頁數(shù):?468

內(nèi)容簡介

作為時下流行的一種系統(tǒng)編程語言,Go 簡單易學(xué),性能很好,且支持各類主流平臺。已有大量項目采用 Go 編寫,這其中就包括 Docker 等明星作品,其開發(fā)和執(zhí)行效率早已被證明。本書經(jīng)四年多逐步完善,內(nèi)容覆蓋了語言、運行時、性能優(yōu)化、工具鏈等各層面知識。且內(nèi)容經(jīng)大量讀者反饋和校對,沒有明顯的缺陷和錯誤。上卷細(xì)致解析了語言規(guī)范相關(guān)細(xì)節(jié),便于讀者深入理解語言相關(guān)功能的使用方法和注意事項。下卷則對運行時源碼做出深度剖析,引導(dǎo)讀者透徹了解語言功能背后的支持環(huán)境和運行體系,諸如內(nèi)存分配、垃圾回收和并發(fā)調(diào)度等。本書不適合編程初學(xué)入門,可供有實際編程經(jīng)驗或正在使用Go 工作的人群參考。

作者簡介??

自 1996 年從事計算機軟件開發(fā)工作以來,已 20 春秋。期間供職于北大方正、西單電子商務(wù)、九城數(shù)碼、知乎等公司。主要從事核心開發(fā)、架構(gòu)設(shè)計,以及部分管理工作。

Go小知識新解

1、值接收者和指針接收者

所謂指針接收者和值接收者這兩個概念,用GO寫了一陣子代碼的人都了解了,這里只做簡要說明一下,也就是對于一個給定結(jié)構(gòu),咱們對結(jié)構(gòu)進(jìn)行方法包裝的時候,固定必傳的參數(shù),用來指向這個對象結(jié)構(gòu)自身的一個參數(shù),在go中也就是形式如下:

我們對結(jié)構(gòu)體testStruct進(jìn)行了包裝,提供了兩個方法,sum和modify,其中sum的方法接收者為a testStruct,這個就是值接收者,而modify的接收者為a *testStruct就是指針接收者,也就是說固定對象指針,一個傳遞的是指針地址,而另外一個直接傳遞的是結(jié)構(gòu)值拷貝了

對指針有一定了解的,都可以知道,指針傳遞過去的,可以直接修改結(jié)構(gòu)內(nèi)部內(nèi)容,而值傳遞過去的,無論如何修改這個接收者的數(shù)據(jù),不會對原對象結(jié)構(gòu)產(chǎn)生影響。而對于咱們包裝結(jié)構(gòu)對象的時候,到底是使用指針還是使用值接收者,這個實際上沒有太大的定論,就我個人的觀點來說,如果結(jié)構(gòu)體占有的內(nèi)存空間不大(kb級別),而又不需要修改內(nèi)部的,同時結(jié)構(gòu)對象內(nèi)部沒有同步對象比如(sync包中的mutex,rwlock,waitgroup等之類的結(jié)構(gòu)的話,可以直接值傳遞,實際上值copy也沒有咱們想象的那么慢,很多時候,都用指針,最后的gc回收掃描可能都比咱們這個傳遞copy的消耗大) p="" /kb級別),而又不需要修改內(nèi)部的,同時結(jié)構(gòu)對象內(nèi)部沒有同步對象比如(sync包中的mutex,rwlock,waitgroup等之類的結(jié)構(gòu)的話,可以直接值傳遞,實際上值copy也沒有咱們想象的那么慢,很多時候,都用指針,最后的gc回收掃描可能都比咱們這個傳遞copy的消耗大)

2、實現(xiàn)接口的值接收者和指針接收者有啥區(qū)別

也就是比如定義如下

這里面的值接收者和指針接收者有什么區(qū)別,這里咱來寫一個測試

通過這個測試用例可以發(fā)現(xiàn),指針接收者實現(xiàn)的接口可以同時支持轉(zhuǎn)移到值接收者接口和指針接收者接口,而用值接收者實現(xiàn)的接口,則無法轉(zhuǎn)移到使用指針接收者實現(xiàn)的接口,為啥子呢?目前網(wǎng)上或者各類資料上都是給的一個很官方很官方,而且很書面話難以理解的說明,大致意思如下:

這是目前網(wǎng)絡(luò)或者各種資料上都是差不多是這樣說的,看似講了,實際上就說了一個結(jié)果,根本就沒說出來一個為什么。這樣的總結(jié)出來,一個初學(xué)者的角度來看,是很不好理解的,初學(xué)者要么就是死記硬背,要么就是生搬硬套,甚至直到寫了好多好多代碼了,都還沒有搞明白一個為啥子,只是會用了而已,從長遠(yuǎn)來說這是不利于自身提高的。

有這兩個本質(zhì)點,咱們自己來思考一下,如果你來實現(xiàn)這個編譯器的時候,用指針接收的時候,指針接收者,默認(rèn)就能直接獲取支持,而值接收者實現(xiàn)接口的咱們可以直接來一個解指針就變成了值,就能匹配上值接收者實現(xiàn)的接口了,反過來說,如果值接收者,此時要匹配指針接收者,如何匹配呢,取一個地址就變成了指針了,此時數(shù)據(jù)類型確實是匹配了,但是,地址指向的數(shù)據(jù)區(qū)不對了,因為我們剛剛說了值接收者拷貝了一個新值之后是完全的一個新的對象,這個新對象和原始對象一點關(guān)系都沒有,咱們?nèi)〉刂?,取的也是這個新對象地址,對這個地址進(jìn)行操作,也是這個新對象的內(nèi)部數(shù)據(jù),和原始數(shù)據(jù)內(nèi)部沒有任何關(guān)系,所以由此就能推斷出,這個是為啥子值接收者不能匹配上指針接收者,而指針接收者卻可以匹配上值接收者了。

1、在某個作用域內(nèi)部,所有定義的字符串的數(shù)據(jù)區(qū)相同

這個很好驗證,代碼如下:

2、字符串相加會產(chǎn)生一個新串

這個也很好驗證

3、字符串真的是不可變的嗎

實際上從字符串的結(jié)構(gòu)

從這個結(jié)構(gòu),就能大致的推斷出來,字符串設(shè)計成這樣就不具備直接擴容+來增加新數(shù)據(jù),而如果咱們直接使用string[index] = 'a',用這種方式,就不能編譯通過,官方也確定說字符串是不可變的。那么真的是不可變的嗎?

通過上面的結(jié)構(gòu),在加上go的slice切片的數(shù)據(jù)結(jié)構(gòu)

由此可見,咱們可以將字符串通過指針方式強轉(zhuǎn)為一個byte數(shù)組指針,然后通過byte切片來修改,試試

編譯通過,運行報錯

unexpected fault address 0xae2e27

fatal error: fault

這個錯誤,基本上就是一個內(nèi)存的保護(hù)錯誤,是寫異常,所以說明了,這個肯定做了內(nèi)存寫保護(hù),那么直接修改一下內(nèi)存區(qū)的屬性,去掉他的寫保護(hù),就能寫了

以下代碼都是在Win平臺,Go1.18,Win上修改內(nèi)存權(quán)限屬性,使用VirtualProtect,代碼如下

此時運行,就能發(fā)現(xiàn)tstr的內(nèi)容被咱們變了,這種情況實際上在實際開發(fā)中不具有實際意義,因為本身在語言層面,已經(jīng)做了層層限制,咱們這是屬于非法強制的操作方式,是流氓行為,那么是否有比較溫和一點的操作方式呢?答案是有的,且往下看。

通過上面,我們已經(jīng)用到了字符串結(jié)構(gòu),切片結(jié)構(gòu),要想字符串內(nèi)容可變,那么咱們自己構(gòu)造字符串的數(shù)據(jù)內(nèi)容區(qū)域,且讓這個數(shù)據(jù)區(qū)木有內(nèi)存寫保護(hù)不就行了,內(nèi)容區(qū)可變,GO原生態(tài)的byte數(shù)組不就行嘛,所以咱們自己構(gòu)造一下

此時我們直接修改buffer的內(nèi)容,就是直接修改了str的數(shù)據(jù)內(nèi)容了。而又不會像前面的一樣遇到內(nèi)存寫保護(hù)

4、字符串轉(zhuǎn)換優(yōu)化時可能碰到的坑

通過前面討論的字符串的可變性的方法,咱們可以知道,很多時候,[]byte到字符串的轉(zhuǎn)變,可以直接構(gòu)造其結(jié)構(gòu),而共享數(shù)據(jù),從而達(dá)到減少數(shù)據(jù)內(nèi)存copy的方式來進(jìn)行優(yōu)化,再使用這些優(yōu)化的時候,一定需要注意,字符串或者數(shù)組的生命周期,是否會存在被改寫的情況,從而導(dǎo)致前后不一致的問題。

比如下面這段代碼:

大家可以猜想一下,這個最后里面的數(shù)據(jù)mmp中,"test"的value是多少,"abcd"的value是多少,然后想想為什么,且等端午之后,再來分解

Go語言基礎(chǔ)語法(一)

本文介紹一些Go語言的基礎(chǔ)語法。

先來看一個簡單的go語言代碼:

go語言的注釋方法:

代碼執(zhí)行結(jié)果:

下面來進(jìn)一步介紹go的基礎(chǔ)語法。

go語言中格式化輸出可以使用 fmt 和 log 這兩個標(biāo)準(zhǔn)庫,

常用方法:

示例代碼:

執(zhí)行結(jié)果:

更多格式化方法可以訪問中的fmt包。

log包實現(xiàn)了簡單的日志服務(wù),也提供了一些格式化輸出的方法。

執(zhí)行結(jié)果:

下面來介紹一下go的數(shù)據(jù)類型

下表列出了go語言的數(shù)據(jù)類型:

int、float、bool、string、數(shù)組和struct屬于值類型,這些類型的變量直接指向存在內(nèi)存中的值;slice、map、chan、pointer等是引用類型,存儲的是一個地址,這個地址存儲最終的值。

常量是在程序編譯時就確定下來的值,程序運行時無法改變。

執(zhí)行結(jié)果:

執(zhí)行結(jié)果:

Go 語言的運算符主要包括算術(shù)運算符、關(guān)系運算符、邏輯運算符、位運算符、賦值運算符以及指針相關(guān)運算符。

算術(shù)運算符:

關(guān)系運算符:

邏輯運算符:

位運算符:

賦值運算符:

指針相關(guān)運算符:

下面介紹一下go語言中的if語句和switch語句。另外還有一種控制語句叫select語句,通常與通道聯(lián)用,這里不做介紹。

if語法格式如下:

if ... else :

else if:

示例代碼:

語法格式:

另外,添加 fallthrough 會強制執(zhí)行后面的 case 語句,不管下一條case語句是否為true。

示例代碼:

執(zhí)行結(jié)果:

下面介紹幾種循環(huán)語句:

執(zhí)行結(jié)果:

執(zhí)行結(jié)果:

也可以通過標(biāo)記退出循環(huán):

--THE END--

分享名稱:go語言代碼記知識點 go語言代碼生成器
本文路徑:http://muchs.cn/article42/dohephc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、ChatGPT、全網(wǎng)營銷推廣、網(wǎng)頁設(shè)計公司、靜態(tài)網(wǎng)站、搜索引擎優(yōu)化

廣告

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

成都做網(wǎng)站