2020春節(jié)假期《go 程序設(shè)計(jì)語(yǔ)言》讀后知識(shí)總結(jié)

前言

TIDB K8S 由GO 語(yǔ)言編寫;mysql 和 mongodb 由c++編寫
go 沒(méi)有構(gòu)造和析構(gòu),沒(méi)有運(yùn)算符重載叠洗,沒(méi)有形參默認(rèn)值凫海,沒(méi)有繼承呛凶,沒(méi)有泛型
go 原生支持 Unicode,可以處理所有國(guó)家的語(yǔ)言
{ 符號(hào)必須和關(guān)鍵字 func 在同一行
gofmt 保存的時(shí)候自動(dòng)格式化go代碼
goimports 保存的時(shí)候自動(dòng)導(dǎo)入包
gometalinter 保存的時(shí)候自動(dòng)檢查go 語(yǔ)法
for 循環(huán)的三種形式:
for 初始化條件;條件(布爾值)行贪;循環(huán)體之后被執(zhí)行的表達(dá)式 {
}
for 條件(布爾值){
// 傳統(tǒng)的while 循環(huán)
}
for _,arg := range os.Args[1:]{
}
Printf 各種參數(shù)解釋:
%d 十進(jìn)制 %x 十六進(jìn)制 %o 八進(jìn)制 %b 二進(jìn)制 %f/%g 浮點(diǎn)數(shù) %t 布爾型
%c 字符(unicode碼點(diǎn)) %s 字符串 %q 帶引號(hào)字符串 %v 內(nèi)置格式任何值
%T 任何值的類型 %% 百分號(hào)本身
聲明的作用域是在程序文本中出現(xiàn)的區(qū)域漾稀,是一個(gè)編譯屬性
變量的生命周期是變量在程序執(zhí)行時(shí)被程序其它部分所引用的起止時(shí)間,是一個(gè)運(yùn)行屬性建瘫。匿名函數(shù)就是生命周期大于作用域的是例子

基本數(shù)據(jù)類型

四大類:基礎(chǔ)類型崭捍;聚合類型(數(shù)組和結(jié)構(gòu)體,slice,map);引用類型(指針啰脚,slice,map,函數(shù)殷蛇,channel);接口類型
rune = int32 byte = uint8 uintptr 無(wú)符號(hào)整數(shù)橄浓,大小不明確粒梦,用于存放指針
字符串是不可變的字節(jié)序列,不能修改
常量是一種表達(dá)式荸实,必須在編譯階段就能計(jì)算出值
常量生成器iota 從0開(kāi)始逐步加1
數(shù)組的定義方式 var a [3]int = [3]int{1,2,3} q := […]int{1,2,3}
[3]int 和 [4]int 并不是同一個(gè)類型
slice 通常寫成 []T ,看上去像是沒(méi)有長(zhǎng)度的數(shù)組類型
map是go語(yǔ)言中散列表的引用匀们。 ages := make(map[string]int)

函數(shù)

func name(parameter-list) (result-list){
body
}

方法

方法的聲明和普通函數(shù)的聲明類似,只是函數(shù)名字前面多了一個(gè)參數(shù)准给,將方法綁在參數(shù)對(duì)應(yīng)的類型上
func (p Point) name(parameter-list) (result-list){
// 將方法綁在Point類型上
}
go 語(yǔ)言中沒(méi)有this 和 self
go 和許多其他面向?qū)ο笳Z(yǔ)言不同泄朴,它可以將方法綁定在任何類型上
同一個(gè)包下的任何類型都可以聲明方法,只要它的類型既不是指針類型也不是接口類型
由于主調(diào)函數(shù)會(huì)復(fù)制每一個(gè)實(shí)參變量露氮,如果一個(gè)函數(shù)需要更新一個(gè)變量祖灰,或者一個(gè)實(shí)參太大,我們想避免復(fù)制整個(gè)實(shí)參畔规,因此需要使用使用指針傳遞變量的地址
指針接收著合法的三種情況:
形參接收者和實(shí)參接收者是同一類型局扶。比如都是T類型或T類型;
實(shí)參接收者是T類型油讯,形參接收者是
T類型详民。編譯器或隱式獲取變量的地址;
實(shí)參接收者是*T類型陌兑,形參接受者是T類型沈跨。編譯器隱式解引用接收者,獲取實(shí)際的值

接口

接口中只包含0個(gè)或多個(gè)方法簽名兔综,不包含具體實(shí)現(xiàn)
實(shí)現(xiàn)接口不需要顯示聲明饿凛,只需要實(shí)現(xiàn)相應(yīng)方法即可
type Namer interface {
method1(param_list) return_list
}
接口的名字最好是以 er , r , able 結(jié)尾
空接口是指沒(méi)有定義任何方法的接口狞玛。空接口類型的變量可以存儲(chǔ)任意類型的變量
類型的斷言 x.(T) x 表示類型為interface{}的變量
T 表示斷言x可能是的類型 true表示斷言成功 false 表示斷言失敗

協(xié)程和通道

通常一個(gè)進(jìn)程里啟動(dòng)上萬(wàn)個(gè)線程涧窒,系統(tǒng)就不堪重負(fù)心肪。go 可以輕松開(kāi)啟百萬(wàn)協(xié)程
通道是并發(fā)安全的數(shù)據(jù)結(jié)構(gòu),類似于內(nèi)存消息隊(duì)列纠吴,允許很多協(xié)程并發(fā)對(duì)通道進(jìn)行讀寫
main函數(shù)運(yùn)行在主協(xié)程里硬鞍。go 語(yǔ)言里只有一個(gè)主協(xié)程,其余都是子協(xié)程戴已,子協(xié)程是平行關(guān)系
主協(xié)程運(yùn)行結(jié)束固该,其它協(xié)程就會(huì)立即消亡,不管它們是否已經(jīng)開(kāi)始運(yùn)行
子協(xié)程異常退出會(huì)傳播到主協(xié)程糖儡,導(dǎo)致主協(xié)程也會(huì)掛掉
var chan1 chan string
chan2 = make(chan string)
單向channel var chan3 chan <- int chan3 := make(chan <- int)
for range 可以讀取 chan 中的值
操作值為nil的channel ||| 被關(guān)閉的channel ||| 正常的 channel
close : panic panic 成功關(guān)閉
c<- : 永遠(yuǎn)阻塞 panic 阻塞或成功發(fā)送
<-c :永遠(yuǎn)阻塞 永遠(yuǎn)不阻塞 阻塞或成功接收

錯(cuò)誤和異常

fmt.Errorf 和 errors.New("something happened ") 自定義一個(gè)錯(cuò)誤
panic 和 recover 處理異常伐坏,然后升級(jí)為錯(cuò)誤返回給系統(tǒng)

使用共享變量實(shí)現(xiàn)并發(fā)(即傳統(tǒng)的同步機(jī)制)

type a struct {
a int
lock sync.Mutex
}
每個(gè)OS線程有一個(gè)固定大小的棧內(nèi)存,一般為2MB左右
協(xié)程的棧不是固定大小的握联,典型情況下為2kb 桦沉,最大限制達(dá)到1GB
OS線程由OS內(nèi)核調(diào)度,每隔幾毫秒金闽,一個(gè)硬件中斷發(fā)給CPU,CPU調(diào)用一個(gè)調(diào)度器的函數(shù)纯露,這個(gè)函數(shù)暫停正在運(yùn)行的線程,將寄存器信息保存在內(nèi)存
go 協(xié)程有自己的調(diào)度器呐矾,于內(nèi)核調(diào)度器類似苔埋,但不是由硬件時(shí)鐘觸發(fā)懦砂,而是go 語(yǔ)言內(nèi)部結(jié)構(gòu)觸發(fā)蜒犯,不需要切換至內(nèi)核環(huán)境
GOMAXPROCS 是m:n 模型中的n
休眠和正在被通道阻塞的gorutine不占用線程
阻塞在I/O 和 其它系統(tǒng)中或調(diào)用非go寫的函數(shù),gorutine需要一個(gè)單獨(dú)的os線程荞膘,但這個(gè)線程不計(jì)算在GOMAXPROCS中
普通線程有獨(dú)特的標(biāo)識(shí)罚随;gorutine 沒(méi)有標(biāo)識(shí)

包 和 go工具

go 自帶100多個(gè)包 go社區(qū)的包可以在http://godoc.org中找到
go 編譯比其它語(yǔ)言快,主要有三個(gè)原因
所有的導(dǎo)入都必須在每一個(gè)源文件的開(kāi)頭顯示列出羽资;
包的依賴性形成有向無(wú)環(huán)圖淘菩,因?yàn)闆](méi)有環(huán),所以包可以獨(dú)立編譯屠升;
包編譯輸出的目標(biāo)文件不僅記錄自己的導(dǎo)出信息潮改,還記錄所依賴包的導(dǎo)出信息。編譯包時(shí)腹暖,編譯器必須從每一個(gè)導(dǎo)入讀取目標(biāo)文件汇在,但不會(huì)超過(guò)這些文件

import (
"fmt"
"os"
)
import (
crypto/rand
mrand ***/rand //避免沖突
)
import (
_ "img" //空導(dǎo)入
)


import (
"geometry/rectangle"
)
var _ = rectangle.Area // 錯(cuò)誤屏蔽器
func main() {
}


import (
_ "geometry/rectangle" //調(diào)用了rectangle 包的Init函數(shù),不需要在代碼中使用
)
func main() {
}
包名一般使用簡(jiǎn)短的名字
go env 查看環(huán)境配置
大部分用戶必須進(jìn)行的唯一的配置是 GOPATH環(huán)境變量
GOROOT:GO發(fā)行版的根目錄脏答,用戶無(wú)需設(shè)置GOROOT
go get -u 獲取每個(gè)包的最新版本
go build / go build . : 意味著對(duì)當(dāng)前目錄進(jìn)行編譯
GOARCH 處理器的架構(gòu) GOOS 目標(biāo)操作系統(tǒng)
go build 的作用:
用于測(cè)試編譯多個(gè)包或一個(gè)main包糕殉;
build 命令編譯包丟棄非main包編譯結(jié)果亩鬼,只是檢查是否能夠被編譯;
保留main包的編譯結(jié)果阿蝶;
/bin 存放編譯后的可執(zhí)行文件 /pkg 存放編譯后的包文件
package main
import (
"fmt"
"cal" //到入自定義的包雳锋,cal必須在src文件下,必須和main同一級(jí)
)
func main() {
fmt.Println("hello word")
fmt.Println("相加",cal.Add(10,20))
fmt.Println("相減",cal.Subtraction(40,50))
}
普通包【非main包】
go build add.go 【編譯add.go,不生成exe執(zhí)行文件】
go build -o add.exe add.go 【指定生成exe執(zhí)行文件羡洁,但不能運(yùn)行此文件玷过,不是main包】
main包
go build main.go 【生成exe執(zhí)行文件】
go build -o main.exe main.go 【指定生成main.exe可執(zhí)行文件】
如果是main包,當(dāng)你執(zhí)行g(shù)o build 之后筑煮,會(huì)在當(dāng)前目錄生成一個(gè)可執(zhí)行文件.exe冶匹。
如果需要再$GOPATH/bin下生成相應(yīng)的文件,需要執(zhí)行g(shù)o install 或 go build -o 路徑/ XXX.exe XXX.go
項(xiàng)目文件夾下有多個(gè)文件
go build 【編譯當(dāng)前目錄下所有的go 文件】
go build add.go delete.go 【編譯add.go 和 delete.go】
go build 會(huì)忽略目錄下以 _ 或 . 開(kāi)頭的文件
go test
文件名以 _test.go 結(jié)尾
test 測(cè)試的方法名以 Test 打頭咆瘟,形參為(t * testing.T),檢查程序的邏輯是否正確
benchmark(基準(zhǔn))測(cè)試以 Benchmark 打頭嚼隘,形參為(t * testing.T),衡量函數(shù)的性能
example測(cè)試的方法以 Example 打頭,形參為(t * testing.T ),提供一個(gè)由編譯器保證正確的文檔
go test -v hello_test.go 測(cè)試整個(gè)文件
go test -v hello_test.go -test.run TestHello 測(cè)試單個(gè)函數(shù)
go run
用于對(duì)命令源碼文件做編譯+鏈接操作 操作產(chǎn)生臨時(shí)可執(zhí)行程序并執(zhí)行袒餐,一般用于調(diào)試程序
go install
用于 構(gòu)建 + 安裝包
對(duì) 庫(kù)源碼文件 go install ,直接編譯整個(gè)包飞蛹,會(huì)個(gè)pkg目錄下生成.a靜態(tài)文件,供其他包調(diào)用
對(duì) 命令源碼文件 go install ,編譯+鏈接+生產(chǎn)可執(zhí)行文件灸眼,會(huì)在/bin目錄下生成可執(zhí)行文件
go build 和 go run 后面加**.go文件 go install 后面直接加xxx目錄名

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末卧檐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子焰宣,更是在濱河造成了極大的恐慌霉囚,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匕积,死亡現(xiàn)場(chǎng)離奇詭異盈罐,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)闪唆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門盅粪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人悄蕾,你說(shuō)我怎么就攤上這事票顾。” “怎么了帆调?”我有些...
    開(kāi)封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵奠骄,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我番刊,道長(zhǎng)含鳞,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任撵枢,我火速辦了婚禮民晒,結(jié)果婚禮上精居,老公的妹妹穿的比我還像新娘。我一直安慰自己潜必,他們只是感情好靴姿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著磁滚,像睡著了一般佛吓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上垂攘,一...
    開(kāi)封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天维雇,我揣著相機(jī)與錄音,去河邊找鬼晒他。 笑死吱型,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的陨仅。 我是一名探鬼主播津滞,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼灼伤!你這毒婦竟也來(lái)了触徐?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤狐赡,失蹤者是張志新(化名)和其女友劉穎撞鹉,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體颖侄,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸟雏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了发皿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片崔慧。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拂蝎,死狀恐怖穴墅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情温自,我是刑警寧澤玄货,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站悼泌,受9級(jí)特大地震影響松捉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜馆里,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一隘世、第九天 我趴在偏房一處隱蔽的房頂上張望可柿。 院中可真熱鬧,春花似錦丙者、人聲如沸复斥。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)目锭。三九已至,卻和暖如春纷捞,著一層夾襖步出監(jiān)牢的瞬間痢虹,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工主儡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奖唯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓糜值,卻偏偏與公主長(zhǎng)得像臭埋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子臀玄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 2,696評(píng)論 0 3
  • Don't communicate by sharing memory, share memory by comm...
    楚江云閱讀 1,310評(píng)論 0 3
  • 環(huán)境搭建 Golang在Mac OS上的環(huán)境配置 使用Visual Studio Code輔助Go源碼編寫 VS ...
    隕石墜滅閱讀 5,777評(píng)論 0 5
  • 一 大年初六瓢阴,路過(guò)小區(qū)門口水果攤,丁...
    狼牙棒_閱讀 388評(píng)論 1 0
  • 在UIAlertViewController出現(xiàn)之后健无,調(diào)用pop方式返回上一級(jí)界面時(shí)荣恐,出現(xiàn)一個(gè)bug: popTo...
    AnderQZ閱讀 285評(píng)論 0 0