Go又稱(chēng)為Golang劳景,是Google的Robert Griesemer、Rob Pike变姨、Ken Thompson開(kāi)發(fā)的一種靜態(tài)編譯型語(yǔ)言衅金,Go語(yǔ)法與C類(lèi)似汁雷,功能具有內(nèi)存安全祟牲、垃圾回收、結(jié)構(gòu)心態(tài)仑鸥、并發(fā)計(jì)算的編程語(yǔ)言。
Go = C + Python
Go起源于2007年变屁,并在2009年正式對(duì)外發(fā)布眼俊,其目標(biāo)是“兼容Python等動(dòng)態(tài)語(yǔ)言的開(kāi)發(fā)速度和C/C++等編譯型語(yǔ)言的性能和安全性”。
Go又被稱(chēng)為“C類(lèi)似語(yǔ)言”或“21世紀(jì)的C語(yǔ)言”粟关,Go從C繼承了相似的表達(dá)式語(yǔ)法疮胖、控制流程結(jié)構(gòu)、基本數(shù)據(jù)類(lèi)型闷板、調(diào)用參數(shù)傳值澎灸、指針等多種思想,還有C一直所看重的編譯機(jī)器代碼的運(yùn)行效率遮晚,和現(xiàn)有操作系統(tǒng)的無(wú)縫適配性昭。
Go沒(méi)有類(lèi)和繼承的概念,因此和Java或C++看起來(lái)并不相同县遣,但它通過(guò)接口實(shí)現(xiàn)了多態(tài)糜颠。Go具有清晰易懂的輕量級(jí)類(lèi)型系統(tǒng)汹族,在類(lèi)型之間沒(méi)有層級(jí)關(guān)系,因此Go是一門(mén)混合型語(yǔ)言其兴。
編譯型語(yǔ)言
Go和C一樣是編譯型靜態(tài)語(yǔ)言顶瞒,因此在運(yùn)行Go程序前必須將其編譯為二進(jìn)制的可執(zhí)行文件。
Go使用編譯器來(lái)編譯代碼元旬,編譯器將源代碼編譯成二進(jìn)制字節(jié)碼格式榴徐,編譯代碼時(shí)編譯器會(huì)檢查錯(cuò)誤、優(yōu)化性能并輸出不同平臺(tái)上運(yùn)行的二進(jìn)制文件匀归。
Go提供了go build
或go run
命令對(duì)Go程序進(jìn)行編譯
-
go build
將Go源代碼編譯成二進(jìn)制可執(zhí)行文件 -
go run
將Go源代碼編譯后會(huì)直接運(yùn)行箕速,編譯時(shí)會(huì)生成臨時(shí)文件而非可執(zhí)行文件,適合調(diào)試程序朋譬。
21世紀(jì)的C語(yǔ)言
- 2005年第一個(gè)雙核處理器誕生
特點(diǎn)
Go是一種靜態(tài)強(qiáng)類(lèi)型盐茎、編譯型、并發(fā)型徙赢、具有垃圾回收機(jī)制的編程語(yǔ)言字柠。
- 語(yǔ)法簡(jiǎn)潔:就類(lèi)型和規(guī)則而言Go與C99、C11相似之處頗多狡赐,因此又被稱(chēng)之為“NextC”窑业。
- 并發(fā)模型
Go從根本上將一切都并行化,運(yùn)行時(shí)使用GoRoutine來(lái)運(yùn)行一切枕屉,包括main.main
入口函數(shù)常柄。
GoRoutine使用協(xié)程的方式來(lái)處理并發(fā)單元,運(yùn)行時(shí)更深度的優(yōu)化處理搀擂,使得并發(fā)編程極為簡(jiǎn)單西潘,無(wú)需處理回調(diào),無(wú)需關(guān)注線程切換哨颂。
Go搭配channel實(shí)現(xiàn)CSP并發(fā)模型喷市,將并發(fā)單元之間的數(shù)據(jù)耦合拆解以各司其職,這對(duì)糾結(jié)于內(nèi)存共享威恼、鎖粒度的開(kāi)發(fā)人員是一種解脫品姓。
- 內(nèi)存分配:Go將一切并發(fā)化帶來(lái)的問(wèn)題是如何實(shí)現(xiàn)高并發(fā)下的內(nèi)存分配和管理,Go選用
tcmalloc
高性能內(nèi)存分配組件來(lái)解決這個(gè)問(wèn)題箫措。 - 垃圾回收:由于指針的存在回收內(nèi)存不能做收縮處理腹备,而Go的指針運(yùn)算被阻止。
- 靜態(tài)鏈接:Go靜態(tài)鏈接只需編譯后的可執(zhí)行文件斤蔓,無(wú)須附加其它即可部署植酥。
- 標(biāo)準(zhǔn)庫(kù):Go標(biāo)準(zhǔn)庫(kù)中值得稱(chēng)道的是
net/http
- 工具鏈:Go無(wú)論是編譯、格式化附迷、錯(cuò)誤檢查惧互、幫助文檔哎媚、第三方包下載與更新都有與之對(duì)應(yīng)的工具。
并發(fā)編程
早期CPU都是以單核形式順序執(zhí)行機(jī)器指令喊儡,C正是這種順序編程語(yǔ)言的代表拨与。順序編程語(yǔ)言中的順序指的是:所有指令都是以串行的方式執(zhí)行,在相同時(shí)刻有且僅有一個(gè)CPU在順序執(zhí)行程序指令艾猜。
隨著CPU發(fā)展單核提升CPU運(yùn)行效率遇到瓶頸买喧,隨后出現(xiàn)多核CPU,相應(yīng)地編程語(yǔ)言也朝向并行化發(fā)展匆赃。
Go從底層原生支持并發(fā)淤毛,無(wú)須第三方庫(kù)。Go的并發(fā)基于goroutine
算柳,goroutine
可理解為一種虛擬線程低淡。Go運(yùn)行時(shí)會(huì)參與調(diào)度goroutine
,并將goroutine
合理地分配給每個(gè)CPU以最大限度地提升CPU性能瞬项。
多個(gè)goroutine
中會(huì)使用channel
通道進(jìn)行通信蔗蹋,通道是一種內(nèi)置的數(shù)據(jù)結(jié)構(gòu),讓用戶在不同goroutine
之間發(fā)送具有指定類(lèi)型的消息囱淋。因此讓編程更傾向于goroutine
之間發(fā)送消息猪杭,而非讓多個(gè)goroutine
爭(zhēng)奪同一個(gè)數(shù)據(jù)的使用權(quán)。