本文介紹一些Go語言的基礎(chǔ)語法。
創(chuàng)新互聯(lián)從2013年創(chuàng)立,先為舟曲等服務(wù)建站,舟曲等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為舟曲企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
先來看一個簡單的go語言代碼:
go語言的注釋方法:
代碼執(zhí)行結(jié)果:
下面來進一步介紹go的基礎(chǔ)語法。
go語言中格式化輸出可以使用 fmt 和 log 這兩個標準庫,
常用方法:
示例代碼:
執(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é)果:
也可以通過標記退出循環(huán):
--THE END--
Map結(jié)構(gòu)跟我們上節(jié)講解的set結(jié)構(gòu)語法差不多 《理解數(shù)據(jù)結(jié)構(gòu)之Set,只要5分鐘》 ,不同是Map語法是一種數(shù)組鍵值對格式,Map也是處理了防止對象鍵值強制類型轉(zhuǎn)換問題。Map是利用數(shù)組特性解決的,我們都知道數(shù)組可以傳入任意類型值,所以Map結(jié)構(gòu)也接收所有類型值。我們剛才說了值不會向?qū)ο竽菢舆M行強制類型轉(zhuǎn)換,如24和"24"就是兩種類型關(guān)系,互不會影響 。
上面example中,創(chuàng)建一個Map對象,上面我們說過Map是一個數(shù)組對象,里面還接收一個數(shù)組對象也就是二維數(shù)組,里面的參數(shù)也就是鍵值對形式,然后設(shè)置map值,map.set方法接收兩個參數(shù),前者是key值后者是value值。這時Map對象添加了name值
上面example中,Map對象提供了查看size屬性,查看當(dāng)前Map結(jié)構(gòu)有幾組數(shù)據(jù)。
上面example中,我們使用Map.get方法獲取對象的屬性值。如果獲取一個Map對象中不存在的則返回undefined。
上面example中,Map.has返回的是一個Boolean值,會去這個Map中查找如果找到返回true,否則返回false,一般用于檢測這個Map中存在該值的時候使用。
上面example中,Map.delete方法刪除結(jié)構(gòu)中某個值,如果這個值存在Map結(jié)構(gòu)中刪除則返回true,如果刪除一個不存在的值則返回false。
上面example中,Map.clear該方法則會清除Map結(jié)構(gòu)中所有的屬性。
上面example中,可以看到Map結(jié)構(gòu)是一個二維數(shù)組,里面是鍵值對形式的。Map結(jié)構(gòu)也可以使用forEach遍歷,它接收3個參數(shù):
我們上面講了Map可以forEach遍歷,這樣循環(huán)解析也可以組成一個新的對象。那么Es6方法新提供了快速將這種結(jié)構(gòu)轉(zhuǎn)換為對象。
一句話總結(jié):Set結(jié)構(gòu)主要用作于判斷某個值是否存在該對象中,而Map結(jié)構(gòu)主要用作于從當(dāng)前結(jié)構(gòu)中獲取該對象的值。
有的情況下我們需求想實現(xiàn),我第一次請求后臺接口Api,當(dāng)我請求過后第二次就走緩存,不在發(fā)送接口Api。
我們在項目需求時,肯定會遇到一個狀態(tài)對應(yīng)著一種操作,如下:
golang原生數(shù)據(jù)類型:按長度:int8(-128-127)、int16、int32、int64。
布爾型:布爾型的值只可以是常量true或者false。一個簡單的例子:varbbool=true。
數(shù)字類型:整型int和浮點型float32、float64,Go語言支持整型和浮點型數(shù)字,并且支持復(fù)數(shù),其中位的運算采用補碼。
字符串類型:字符串就是一串固定長度的字符連接起來的字符序列。Go的字符串是由單個字節(jié)連接起來的。Go語言的字符串的字節(jié)使用UTF-8編碼標識Unicode文本。
派生類型:包括:(a)指針類型(Pointer)(b)數(shù)組類型?結(jié)構(gòu)化類型(struct)(d)Channel類型(e)函數(shù)類型(f)切片類型(g)接口類型(interface)(h)Map類型。
XYZ格式轉(zhuǎn)換為Map格式可以使用QGIS的xyz2mesh插件,用戶可以在柵格數(shù)據(jù)轉(zhuǎn)換對話框中選擇XYZ文件,分辨率和Z值字段,然后將格式更改為Map格式,點擊“確定”完成轉(zhuǎn)換。Map格式文件有助于用戶快速顯示和瀏覽大量數(shù)據(jù),更好地控制地圖的外觀和動畫。
前面,我們講了map的用法以及原理 Golang中map的實現(xiàn)原理 ,但我們知道,map在并發(fā)讀寫的情況下是不安全。需要并發(fā)讀寫時,一般的做法是加鎖,但這樣性能并不高,Go語言在 1.9 版本中提供了一種效率較高的并發(fā)安全的 sync.Map,今天,我們就來講講 sync.Map的用法以及原理
sync.Map與map不同,不是以語言原生形態(tài)提供,而是在 sync 包下的特殊結(jié)構(gòu):
我們下來看下sync.Map結(jié)構(gòu)體
結(jié)構(gòu)體之間的關(guān)系如下圖所示:
總結(jié)一下:
Load方法比較簡單,總結(jié)一下:
總結(jié)如下:
基本設(shè)計思路:
類型轉(zhuǎn)換、類型斷言、動態(tài)派發(fā)。iface,eface。
反射對象具有的方法:
編譯優(yōu)化:
內(nèi)部實現(xiàn):
實現(xiàn) Context 接口有以下幾個類型(空實現(xiàn)就忽略了):
互斥鎖的控制邏輯:
設(shè)計思路:
(以上為寫被讀阻塞,下面是讀被寫阻塞)
總結(jié),讀寫鎖的設(shè)計還是非常巧妙的:
設(shè)計思路:
WaitGroup 有三個暴露的函數(shù):
部件:
設(shè)計思路:
結(jié)構(gòu):
Once 只暴露了一個方法:
實現(xiàn):
三個關(guān)鍵點:
細節(jié):
讓多協(xié)程任務(wù)的開始執(zhí)行時間可控(按順序或歸一)。(Context 是控制結(jié)束時間)
設(shè)計思路: 通過一個鎖和內(nèi)置的 notifyList 隊列實現(xiàn),Wait() 會生成票據(jù),并將等待協(xié)程信息加入鏈表中,等待控制協(xié)程中發(fā)送信號通知一個(Signal())或所有(Boardcast())等待者(內(nèi)部實現(xiàn)是通過票據(jù)通知的)來控制協(xié)程解除阻塞。
暴露四個函數(shù):
實現(xiàn)細節(jié):
部件:
包: golang.org/x/sync/errgroup
作用:開啟 func() error 函數(shù)簽名的協(xié)程,在同 Group 下協(xié)程并發(fā)執(zhí)行過程并收集首次 err 錯誤。通過 Context 的傳入,還可以控制在首次 err 出現(xiàn)時就終止組內(nèi)各協(xié)程。
設(shè)計思路:
結(jié)構(gòu):
暴露的方法:
實現(xiàn)細節(jié):
注意問題:
包: "golang.org/x/sync/semaphore"
作用:排隊借資源(如錢,有借有還)的一種場景。此包相當(dāng)于對底層信號量的一種暴露。
設(shè)計思路:有一定數(shù)量的資源 Weight,每一個 waiter 攜帶一個 channel 和要借的數(shù)量 n。通過隊列排隊執(zhí)行借貸。
結(jié)構(gòu):
暴露方法:
細節(jié):
部件:
細節(jié):
包: "golang.org/x/sync/singleflight"
作用:防擊穿。瞬時的相同請求只調(diào)用一次,response 被所有相同請求共享。
設(shè)計思路:按請求的 key 分組(一個 *call 是一個組,用 map 映射存儲組),每個組只進行一次訪問,組內(nèi)每個協(xié)程會獲得對應(yīng)結(jié)果的一個拷貝。
結(jié)構(gòu):
邏輯:
細節(jié):
部件:
如有錯誤,請批評指正。