golang在1.6.2的時候還沒有自己的context,在1.7的版本中就把golang.org/x/net/context包被加入到了官方的庫中。中文譯作“上下文”,它主要包含了goroutine 的運(yùn)行狀態(tài)、環(huán)境等信息。
十年的華龍網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。全網(wǎng)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整華龍建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“華龍網(wǎng)站設(shè)計(jì)”,“華龍網(wǎng)站推廣”以來,每個客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
context 主要用來在 goroutine 之間傳遞上下文信息,包括:同步信號、超時時間、截止時間、請求相關(guān)值等。
該接口定義了四個需要實(shí)現(xiàn)的方法:
如果有個網(wǎng)絡(luò)請求Request,然后這個請求又可以開啟多個goroutine做一些事情,當(dāng)這個網(wǎng)絡(luò)請求出現(xiàn)異常和超時時,這個請求結(jié)束了,這時候就可以通過context來跟蹤這些goroutine,并且通過Context來取消他們,然后系統(tǒng)才可回收所占用的資源。
為了更方便的創(chuàng)建Context,包里頭定義了Background來作為所有Context的根,它是一個emptyCtx的實(shí)例。
Background返回一個非空的Context。它永遠(yuǎn)不會被取消。它通常用來初始化和測試使用,作為一個頂層的context,也就是說一般我們創(chuàng)建的context都是基于Background。
TODO返回一個非空的Context。當(dāng)不清楚要使用哪個上下文的時候可以使用TODO。
他們兩個本質(zhì)上都是emptyCtx結(jié)構(gòu)體類型,是一個不可取消,沒有設(shè)置截止時間,沒有攜帶任何值的Context。
有了如上的根Context,那么是如何衍生更多的子Context的呢?這就要靠context包為我們提供的With系列的函數(shù)了。
通過這些函數(shù),就創(chuàng)建了一顆Context樹,樹的每個節(jié)點(diǎn)都可以有任意多個子節(jié)點(diǎn),節(jié)點(diǎn)層級可以有任意多個。
WithCancel函數(shù),最常用的派生 context 方法。該方法接受一個父 context。父 context 可以是一個 background context 或其他 context。
WithDeadline函數(shù),該方法會創(chuàng)建一個帶有 deadline 的 context。當(dāng) deadline 到期后,該 context 以及該 context 的可能子 context 會受到 cancel 通知。另外,如果 deadline 前調(diào)用 cancelFunc 則會提前發(fā)送取消通知。
WithTimeout和WithDeadline基本上一樣,這個表示是超時自動取消,是多少時間后自動取消Context的意思。
WithValue函數(shù)和取消Context無關(guān),它是為了生成一個綁定了一個鍵值對數(shù)據(jù)的Context,這個綁定的數(shù)據(jù)可以通過Context.Value方法訪問到,一般我們想要通過上下文來傳遞數(shù)據(jù)時,可以通過這個方法,如我們需要tarce追蹤系統(tǒng)調(diào)用棧的時候。
使用Context的程序應(yīng)遵循以下規(guī)則,以使各個包之間的接口保持一致:
1.不要將 Context 塞到結(jié)構(gòu)體里。直接將 Context 類型作為函數(shù)的第一參數(shù),而且一般都命名為 ctx。
2.不要向函數(shù)傳入一個 nil 的 context,如果你實(shí)在不知道傳什么,標(biāo)準(zhǔn)庫給你準(zhǔn)備好了一個 context:todo。
3.不要把本應(yīng)該作為函數(shù)參數(shù)的類型塞到 context 中,context 存儲的應(yīng)該是一些共同的數(shù)據(jù)。例如:登陸的 session、cookie 等。
4.同一個 context 可能會被傳遞到多個 goroutine,別擔(dān)心,context 是并發(fā)安全的。
《學(xué)習(xí)Go語言》百度網(wǎng)盤pdf最新全集下載:
鏈接:
?pwd=je9c 提取碼: je9c
簡介:Google工程師親授,從學(xué)習(xí)語言語法特性到函數(shù)式編程、并發(fā)編程等等。理論與實(shí)戰(zhàn)結(jié)合,幫助快速掌握Go語言。通過研讀標(biāo)準(zhǔn)庫等經(jīng)典代碼設(shè)計(jì)模式,啟發(fā)讀者深刻理解Go語言的核心思維,進(jìn)入Go語言開發(fā)的更高階段。 ?
1. os.Getwd()函數(shù)
原型:func Getwd()(pwd string, err error)
作用:獲取當(dāng)前文件路徑
返回:當(dāng)前文件路徑的字符串和一個err信息
示例:
輸出:
當(dāng)前路徑: D:ProjectsGomGoLab01
2. os.Getenv()函數(shù)
原型:func Getenv(key string) string
作用:獲取系統(tǒng)環(huán)境變量的值
參數(shù):key - 系統(tǒng)環(huán)境變量名
返回:系統(tǒng)環(huán)境變量的值
示例:
輸出:
環(huán)境變量GOPATH的值是: D:/Projects/Go
3. os.Chdir()函數(shù)
原型:func Chdir(dir string) error
作用:將當(dāng)前文件路徑改變?yōu)槟繕?biāo)路徑(非真實(shí)改變)
參數(shù):dir - 目標(biāo)路徑(即改變之后的路徑)
返回:修改成功,返回 nil;修改失敗(如:目標(biāo)路徑不存在的情況),返回錯誤信息。
示例一:
輸出:
起始路徑: D:ProjectsGomGoLab01
修改后的路徑: D:ProjectsGoDemo02
示例二:
輸出:
起始路徑: D:ProjectsGomGoLab01
error: chdir D:ProjectsGoDemo03: The system cannot find the file specified.
注:文件路徑,Window 系統(tǒng)下默認(rèn)是“”,寫在代碼中時要用“”或“/”代替。
本文介紹一些Go語言的基礎(chǔ)語法。
先來看一個簡單的go語言代碼:
go語言的注釋方法:
代碼執(zhí)行結(jié)果:
下面來進(jìn)一步介紹go的基礎(chǔ)語法。
go語言中格式化輸出可以使用 fmt 和 log 這兩個標(biāo)準(zhǔn)庫,
常用方法:
示例代碼:
執(zhí)行結(jié)果:
更多格式化方法可以訪問中的fmt包。
log包實(shí)現(xiàn)了簡單的日志服務(wù),也提供了一些格式化輸出的方法。
執(zhí)行結(jié)果:
下面來介紹一下go的數(shù)據(jù)類型
下表列出了go語言的數(shù)據(jù)類型:
int、float、bool、string、數(shù)組和struct屬于值類型,這些類型的變量直接指向存在內(nèi)存中的值;slice、map、chan、pointer等是引用類型,存儲的是一個地址,這個地址存儲最終的值。
常量是在程序編譯時就確定下來的值,程序運(yùn)行時無法改變。
執(zhí)行結(jié)果:
執(zhí)行結(jié)果:
Go 語言的運(yùn)算符主要包括算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符、賦值運(yùn)算符以及指針相關(guān)運(yùn)算符。
算術(shù)運(yùn)算符:
關(guān)系運(yùn)算符:
邏輯運(yùn)算符:
位運(yùn)算符:
賦值運(yùn)算符:
指針相關(guān)運(yùn)算符:
下面介紹一下go語言中的if語句和switch語句。另外還有一種控制語句叫select語句,通常與通道聯(lián)用,這里不做介紹。
if語法格式如下:
if ... else :
else if:
示例代碼:
語法格式:
另外,添加 fallthrough 會強(qiáng)制執(zhí)行后面的 case 語句,不管下一條case語句是否為true。
示例代碼:
執(zhí)行結(jié)果:
下面介紹幾種循環(huán)語句:
執(zhí)行結(jié)果:
執(zhí)行結(jié)果:
也可以通過標(biāo)記退出循環(huán):
--THE END--