「golang系列」淺談Go語言

導語

Go語言(也稱為Golang)是google在2009年推出的一種編譯型編程語言。相對于大多數(shù)語言,golang具有編寫并發(fā)或網(wǎng)絡交互簡單赃绊、豐富的數(shù)據(jù)類型岂昭、編譯快等特點,比較適合于高性能车伞、高并發(fā)場景择懂。本文主要基于筆者的親身實踐和總結,介紹golang的一些特性另玖,重點介紹并發(fā)的實現(xiàn)和使用困曙,希望能引發(fā)讀者一些啟發(fā)或興趣。

1谦去、Golang簡介

Go語言(也稱為Golang)是google在2009年推出的一種編譯型編程語言慷丽。相對于大多數(shù)語言,golang具有編寫并發(fā)或網(wǎng)絡交互簡單鳄哭、豐富的數(shù)據(jù)類型要糊、編譯快等特點,比較適合于高性能妆丘、高并發(fā)場景锄俄。2015年度的TIOBE指數(shù)計算機語言份額排名中,golang排在60+名勺拣,19年7月已上升到16名奶赠。

筆者曾于15年上半年在2個實際項目中引入golang 1.3,代碼量大概在3000行左右药有,最大的體會是并發(fā)編程入門容易毅戈。本文將以1.3來介紹,不過golang團隊更新太快,19年最新版本已到了1.12竹祷,不過核心設計思想與1.3并無大差異谈跛。

眾所周知,曾經在很長一段時間里塑陵,google保持著一個傳統(tǒng)感憾,允許員工擁有20%自由時間來開發(fā)實驗性項目,可惜現(xiàn)在該制度已經廢棄令花。golang正是由一個強大團隊利用這20%時間開發(fā)的阻桅。這里有必要介紹一下該團隊的核心成員,個個來頭不小兼都,都是計算機領域大神級人物嫂沉。最大牌的當屬B和C語言設計者、Unix和Plan 9創(chuàng)始人扮碧、1983年圖靈獎獲得者Ken Thompson趟章,其以70+歲高齡,不知道在golang實際開發(fā)中撰了多少代碼......另外慎王,這份名單中還包括了Unix核心成員Rob Pike蚓土、java HotSpot虛擬機和js v8引擎的開發(fā)者Robert Griesemer、Memcached作者Brad Fitzpatrick赖淤,等等蜀漆。

OK,進入正題咱旱,筆者結合個人整理和思考确丢,依次介紹golang幾個值得一說的特性和精髓,如果讀者能從中受到某些啟發(fā)吐限,就足夠了鲜侥。

2、并發(fā)編程

通過實踐毯盈,筆者認為golang在并發(fā)編程方面比絕大多數(shù)語言要簡潔不少剃毒,這一點是其最大亮點之一,也是其在未來進入高并發(fā)高性能場景的重要籌碼搂赋。

不同于傳統(tǒng)的多進程或多線程赘阀,golang的并發(fā)執(zhí)行單元是一種稱為goroutine的協(xié)程。協(xié)程這個概念已被引入到不少語言中脑奠,比如golang基公、python、lua等宋欺。協(xié)程經常被理解為輕量級線程轰豆,一個線程可以包含多個協(xié)程胰伍,共享堆不共享棧。協(xié)程間一般由應用程序顯式實現(xiàn)調度酸休,上下文切換無需下到內核層骂租,高效不少。協(xié)程間一般不做同步通訊斑司,而golang中實現(xiàn)協(xié)程間通訊有兩種:1)共享內存型渗饮,即使用全局變量+mutex鎖來實現(xiàn)數(shù)據(jù)共享;2)消息傳遞型宿刮,即使用一種獨有的channel機制進行異步通訊互站。

由于在共享數(shù)據(jù)場景中會用到鎖,再加上GC僵缺,其并發(fā)性能有時不如異步復用IO模型胡桃,因此相對于大多數(shù)語言來說,golang的并發(fā)編程簡單比并發(fā)性能更具賣點磕潮。

2.1翠胰、示例說明

下面是一段用golang寫的并發(fā)程序:

package main

import {
    "fmt"
    "runtime"
    "time"
}
var MULTICORE int
func main() {
    MULTICORE = runtime.NumCPU()    //計算出本地的cpu核總數(shù)
    //指定MULTICORE個核來運行
    //這里沒有設置cpu親和性,所以各個線程會在任意cpu核上跑揉抵,同一個線程也可能會不斷跳到不同核上運行
    runtime.GOMAXPROCS(MULTICORE)   
    // 啟動MULTICORE個goroutine來執(zhí)行test()
    for i := 0; i < MULTICORE; i++ {
        go test()
    }
    // sleep 10s是為了讓主進程等待所有goroutine都運行退出
    time.Sleep(10*time.Second)
}
func test() {
    for i := 0; i < 10; i++ {
        fmt.Printf("test\n")
    }
}

可以看出亡容,啟動一個goroutine很容易,只需要在(匿名)函數(shù)前面加個go關鍵字就行冤今,還能夠指定運行核數(shù),以期充分利用機器的計算能力茂缚。

2.2戏罢、底層實現(xiàn)

golang的m:n線程模型

golang相較于傳統(tǒng)語言,為了更好適應現(xiàn)代多核脚囊、高并發(fā)場景龟糕,獨創(chuàng)了自己的協(xié)程模型,采用m:n模型悔耘,即m個gorountine(簡稱為G)映射到n個用戶態(tài)上下文(簡稱為P)上讲岁,一個P向上維護多個G組成的一個隊列,一個P向下與一個內核態(tài)工作線程(簡稱為M)相綁定衬以。

完整文章見:https://github.com/star2478/golang-wiki/wiki/%E6%B5%85%E8%B0%88Go%E8%AF%AD%E8%A8%80

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末缓艳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子看峻,更是在濱河造成了極大的恐慌阶淘,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件互妓,死亡現(xiàn)場離奇詭異溪窒,居然都是意外死亡坤塞,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門澈蚌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來摹芙,“玉大人,你說我怎么就攤上這事宛瞄√北纾” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵坛悉,是天一觀的道長伐厌。 經常有香客問我,道長裸影,這世上最難降的妖魔是什么挣轨? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮轩猩,結果婚禮上卷扮,老公的妹妹穿的比我還像新娘。我一直安慰自己均践,他們只是感情好晤锹,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著彤委,像睡著了一般鞭铆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上焦影,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天车遂,我揣著相機與錄音,去河邊找鬼斯辰。 笑死舶担,一個胖子當著我的面吹牛,可吹牛的內容都是我干的彬呻。 我是一名探鬼主播衣陶,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼闸氮!你這毒婦竟也來了剪况?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤湖苞,失蹤者是張志新(化名)和其女友劉穎拯欧,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體财骨,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡镐作,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年藏姐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片该贾。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡羔杨,死狀恐怖,靈堂內的尸體忽然破棺而出杨蛋,到底是詐尸還是另有隱情兜材,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布逞力,位于F島的核電站曙寡,受9級特大地震影響,放射性物質發(fā)生泄漏寇荧。R本人自食惡果不足惜举庶,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望揩抡。 院中可真熱鬧户侥,春花似錦、人聲如沸峦嗤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烁设。三九已至替梨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間署尤,已是汗流浹背耙替。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留曹体,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓硝烂,卻偏偏與公主長得像箕别,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子滞谢,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容