《Go語言學習筆記》(雨痕)電子書網盤下載免費在線閱讀

成都創新互聯公司一直秉承“誠信做人,踏實做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務為基礎,以質量求生存,以技術求發展,成交一個客戶多一個朋友!為您提供做網站、網站建設、成都網頁設計、微信平臺小程序開發、成都網站開發、成都網站制作、成都軟件開發、重慶APP軟件開發是成都本地專業的網站建設和網站設計公司,等你一起來見證!
鏈接:
提取碼:qyzq ?
書名:Go語言學習筆記
豆瓣評分:8.1
作者:?雨痕
出版社:?電子工業出版社
出品方:?博文視點
出版年:?2016-6
頁數:?468
內容簡介
作為時下流行的一種系統編程語言,Go 簡單易學,性能很好,且支持各類主流平臺。已有大量項目采用 Go 編寫,這其中就包括 Docker 等明星作品,其開發和執行效率早已被證明。本書經四年多逐步完善,內容覆蓋了語言、運行時、性能優化、工具鏈等各層面知識。且內容經大量讀者反饋和校對,沒有明顯的缺陷和錯誤。上卷細致解析了語言規范相關細節,便于讀者深入理解語言相關功能的使用方法和注意事項。下卷則對運行時源碼做出深度剖析,引導讀者透徹了解語言功能背后的支持環境和運行體系,諸如內存分配、垃圾回收和并發調度等。本書不適合編程初學入門,可供有實際編程經驗或正在使用Go 工作的人群參考。
作者簡介??
自 1996 年從事計算機軟件開發工作以來,已 20 春秋。期間供職于北大方正、西單電子商務、九城數碼、知乎等公司。主要從事核心開發、架構設計,以及部分管理工作。
1、值接收者和指針接收者
所謂指針接收者和值接收者這兩個概念,用GO寫了一陣子代碼的人都了解了,這里只做簡要說明一下,也就是對于一個給定結構,咱們對結構進行方法包裝的時候,固定必傳的參數,用來指向這個對象結構自身的一個參數,在go中也就是形式如下:
我們對結構體testStruct進行了包裝,提供了兩個方法,sum和modify,其中sum的方法接收者為a testStruct,這個就是值接收者,而modify的接收者為a *testStruct就是指針接收者,也就是說固定對象指針,一個傳遞的是指針地址,而另外一個直接傳遞的是結構值拷貝了
對指針有一定了解的,都可以知道,指針傳遞過去的,可以直接修改結構內部內容,而值傳遞過去的,無論如何修改這個接收者的數據,不會對原對象結構產生影響。而對于咱們包裝結構對象的時候,到底是使用指針還是使用值接收者,這個實際上沒有太大的定論,就我個人的觀點來說,如果結構體占有的內存空間不大(kb級別),而又不需要修改內部的,同時結構對象內部沒有同步對象比如(sync包中的mutex,rwlock,waitgroup等之類的結構的話,可以直接值傳遞,實際上值copy也沒有咱們想象的那么慢,很多時候,都用指針,最后的gc回收掃描可能都比咱們這個傳遞copy的消耗大) p="" /kb級別),而又不需要修改內部的,同時結構對象內部沒有同步對象比如(sync包中的mutex,rwlock,waitgroup等之類的結構的話,可以直接值傳遞,實際上值copy也沒有咱們想象的那么慢,很多時候,都用指針,最后的gc回收掃描可能都比咱們這個傳遞copy的消耗大)
2、實現接口的值接收者和指針接收者有啥區別
也就是比如定義如下
這里面的值接收者和指針接收者有什么區別,這里咱來寫一個測試
通過這個測試用例可以發現,指針接收者實現的接口可以同時支持轉移到值接收者接口和指針接收者接口,而用值接收者實現的接口,則無法轉移到使用指針接收者實現的接口,為啥子呢?目前網上或者各類資料上都是給的一個很官方很官方,而且很書面話難以理解的說明,大致意思如下:
這是目前網絡或者各種資料上都是差不多是這樣說的,看似講了,實際上就說了一個結果,根本就沒說出來一個為什么。這樣的總結出來,一個初學者的角度來看,是很不好理解的,初學者要么就是死記硬背,要么就是生搬硬套,甚至直到寫了好多好多代碼了,都還沒有搞明白一個為啥子,只是會用了而已,從長遠來說這是不利于自身提高的。
有這兩個本質點,咱們自己來思考一下,如果你來實現這個編譯器的時候,用指針接收的時候,指針接收者,默認就能直接獲取支持,而值接收者實現接口的咱們可以直接來一個解指針就變成了值,就能匹配上值接收者實現的接口了,反過來說,如果值接收者,此時要匹配指針接收者,如何匹配呢,取一個地址就變成了指針了,此時數據類型確實是匹配了,但是,地址指向的數據區不對了,因為我們剛剛說了值接收者拷貝了一個新值之后是完全的一個新的對象,這個新對象和原始對象一點關系都沒有,咱們取地址,取的也是這個新對象地址,對這個地址進行操作,也是這個新對象的內部數據,和原始數據內部沒有任何關系,所以由此就能推斷出,這個是為啥子值接收者不能匹配上指針接收者,而指針接收者卻可以匹配上值接收者了。
1、在某個作用域內部,所有定義的字符串的數據區相同
這個很好驗證,代碼如下:
2、字符串相加會產生一個新串
這個也很好驗證
3、字符串真的是不可變的嗎
實際上從字符串的結構
從這個結構,就能大致的推斷出來,字符串設計成這樣就不具備直接擴容+來增加新數據,而如果咱們直接使用string[index] = 'a',用這種方式,就不能編譯通過,官方也確定說字符串是不可變的。那么真的是不可變的嗎?
通過上面的結構,在加上go的slice切片的數據結構
由此可見,咱們可以將字符串通過指針方式強轉為一個byte數組指針,然后通過byte切片來修改,試試
編譯通過,運行報錯
unexpected fault address 0xae2e27
fatal error: fault
這個錯誤,基本上就是一個內存的保護錯誤,是寫異常,所以說明了,這個肯定做了內存寫保護,那么直接修改一下內存區的屬性,去掉他的寫保護,就能寫了
以下代碼都是在Win平臺,Go1.18,Win上修改內存權限屬性,使用VirtualProtect,代碼如下
此時運行,就能發現tstr的內容被咱們變了,這種情況實際上在實際開發中不具有實際意義,因為本身在語言層面,已經做了層層限制,咱們這是屬于非法強制的操作方式,是流氓行為,那么是否有比較溫和一點的操作方式呢?答案是有的,且往下看。
通過上面,我們已經用到了字符串結構,切片結構,要想字符串內容可變,那么咱們自己構造字符串的數據內容區域,且讓這個數據區木有內存寫保護不就行了,內容區可變,GO原生態的byte數組不就行嘛,所以咱們自己構造一下
此時我們直接修改buffer的內容,就是直接修改了str的數據內容了。而又不會像前面的一樣遇到內存寫保護
4、字符串轉換優化時可能碰到的坑
通過前面討論的字符串的可變性的方法,咱們可以知道,很多時候,[]byte到字符串的轉變,可以直接構造其結構,而共享數據,從而達到減少數據內存copy的方式來進行優化,再使用這些優化的時候,一定需要注意,字符串或者數組的生命周期,是否會存在被改寫的情況,從而導致前后不一致的問題。
比如下面這段代碼:
大家可以猜想一下,這個最后里面的數據mmp中,"test"的value是多少,"abcd"的value是多少,然后想想為什么,且等端午之后,再來分解
本文介紹一些Go語言的基礎語法。
先來看一個簡單的go語言代碼:
go語言的注釋方法:
代碼執行結果:
下面來進一步介紹go的基礎語法。
go語言中格式化輸出可以使用 fmt 和 log 這兩個標準庫,
常用方法:
示例代碼:
執行結果:
更多格式化方法可以訪問中的fmt包。
log包實現了簡單的日志服務,也提供了一些格式化輸出的方法。
執行結果:
下面來介紹一下go的數據類型
下表列出了go語言的數據類型:
int、float、bool、string、數組和struct屬于值類型,這些類型的變量直接指向存在內存中的值;slice、map、chan、pointer等是引用類型,存儲的是一個地址,這個地址存儲最終的值。
常量是在程序編譯時就確定下來的值,程序運行時無法改變。
執行結果:
執行結果:
Go 語言的運算符主要包括算術運算符、關系運算符、邏輯運算符、位運算符、賦值運算符以及指針相關運算符。
算術運算符:
關系運算符:
邏輯運算符:
位運算符:
賦值運算符:
指針相關運算符:
下面介紹一下go語言中的if語句和switch語句。另外還有一種控制語句叫select語句,通常與通道聯用,這里不做介紹。
if語法格式如下:
if ... else :
else if:
示例代碼:
語法格式:
另外,添加 fallthrough 會強制執行后面的 case 語句,不管下一條case語句是否為true。
示例代碼:
執行結果:
下面介紹幾種循環語句:
執行結果:
執行結果:
也可以通過標記退出循環:
--THE END--
分享名稱:go語言代碼記知識點 go語言代碼生成器
本文路徑:http://www.yijiale78.com/article42/dohephc.html
成都網站建設公司_創新互聯,為您提供商城網站、ChatGPT、全網營銷推廣、網頁設計公司、靜態網站、搜索引擎優化
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯