我先想分析一下現(xiàn)在有哪些公司使用go 語言柳畔,go語言在實際開發(fā)中有哪些使用場景,為什么要從其他語言轉(zhuǎn)換成go語言。我覺得這是學(xué)習(xí)一門新語言一個很重要的問題。
Go大概09年面世以來宪巨,已經(jīng)有很多公司開始使用Go語言開發(fā)自己的服務(wù),甚至完全轉(zhuǎn)向Go開發(fā)铣猩,也誕生了很多基于Go的服務(wù)和應(yīng)用揖铜,比如Dokcer、k8s等达皿,現(xiàn)在我們看下,有哪些大公司在用Go語言了贿肩。
【Google】? ?
這個不用多做介紹峦椰,作為開發(fā)Go語言的公司,當仁不讓汰规。Google基于Go有很多優(yōu)秀的項目汤功,比如:https://github.com/kubernetes/kubernetes?,大家也可以在Github上?https://github.com/google/?查看更多Google的Go開源項目溜哮。
【七盘辖穑】? ? ? ? ? ? ? ? ?
整個產(chǎn)品(包括基礎(chǔ)服務(wù)、Web端茂嗓、統(tǒng)計平臺餐茵、各類小工具等等),Go代碼行數(shù)占比:99.9%述吸。七牛算是國內(nèi)第一家選 Go 語言做服務(wù)端的公司忿族。早在2011年,當Go語法還沒完全穩(wěn)定下來的情況下蝌矛,七牛就已經(jīng)選擇將Go作為存儲服務(wù)端的主題語言道批。關(guān)于這點,七牛CEO許式偉談到:“我曾多次公開分享過Go語言的亮點入撒,包括它的并發(fā)編程模型隆豹、對軟件工程的支持,以及對編程哲學(xué)的重塑茅逮。在我看來璃赡,Go對并發(fā)與分布式的支持算不上特別簿煌,所有新興的語言也都有工程化的思想,所以編程哲學(xué)的重塑才是Go語言獨樹一幟的根本原因鉴吹,其它語言仍難以擺脫OOP或函數(shù)式編程的烙印姨伟,只有Go完全放棄了這些,對編程范式重新思考豆励,對熱門的面向?qū)ο缶幊烫峁O度簡約但卻完備的支持夺荒。Go把其全新的編程理念,稱為面向連接的語言良蒸。作為一名老程序員技扼,我認為Go的編程哲學(xué)獨具魅力,超越其它新興語言嫩痰。前VMware云平臺的首席技術(shù)官Derek Collison剿吻,曾在2012年斷言Go語言將在兩年內(nèi)制霸云計算。我認為他的說法略有激進串纺,但和實際的發(fā)展趨勢吻合丽旅,Docker、CoreOS等新的云計算基礎(chǔ)設(shè)施都基于Go纺棺。在我看來榄笙,Go是互聯(lián)網(wǎng)時代的C語言,不僅會制霸云計算祷蝌,10年內(nèi)將會制霸整個IT領(lǐng)域茅撞。” 參考http://digi.163.com/14/1121/22/ABJV4BNU001618JV.html
【新浪微博】
中間件和彈性調(diào)度用 Java 和 Go 編寫巨朦,微博視頻轉(zhuǎn)碼及存儲服務(wù)用 Go 編寫米丘。
【京東】
京東云消息推送系統(tǒng)用 Go 編寫
【嗶哩嗶哩】
參考:https://www.zhihu.com/question/65782086?如何看待嗶哩嗶哩用go語言重寫所有的java后臺工程?
【百度】
百度運維的一個BFE項目糊啡,負責(zé)前端流量的接入拄查。他們的負責(zé)人在2016年有分享,大家可以看下這個?http://www.infoq.com/cn/presentations/application-of-golang-in-baidu-frontend?.其次就是百度的消息系統(tǒng)悔橄,從其最近的Golang招聘介紹就可以看出來. > 負責(zé)公司手百消息通訊系統(tǒng)服務(wù)器端開發(fā)及維護
【小米?】
小米對Golang的支持靶累,莫過于運維監(jiān)控系統(tǒng)的開源,也就是?http://open-falcon.com/?癣疟。此外挣柬,小米互娛、小米商城睛挚、小米視頻邪蛔、小米生態(tài)鏈等團隊都在使用Golang。
Go適合用來做什么? 扎狱?
服務(wù)器編程:以前你如果使用C或者C++做的那些事情侧到,用Go來做很合適勃教,例如處理日志、數(shù)據(jù)打包匠抗、虛擬機處理故源、文件系統(tǒng)等。
分布式系統(tǒng):數(shù)據(jù)庫代理器等 汞贸。
網(wǎng)絡(luò)編程:這一塊目前應(yīng)用最廣绳军,包括Web應(yīng)用、API應(yīng)用矢腻、下載應(yīng)用门驾、? 內(nèi)存數(shù)據(jù)庫,前一段時間google開發(fā)的groupcache多柑,couchbase的部分組建奶是。
云平臺:目前國外很多云平臺在采用Go開發(fā),CloudFoundy的部分組建竣灌,前VMare的技術(shù)總監(jiān)自己出來搞的apcera云平臺聂沙。??
Go 的優(yōu)點的體會 ?
為什么我會選擇Golang呢帐偎?
其實我在做出這個選擇之前已經(jīng)花了大量時間做過詳盡調(diào)研逐纬。 國外如Google、AWS削樊、Cloudflare、CoreOS等兔毒,國內(nèi)如七牛漫贞、阿里等都已經(jīng)開始大規(guī)模使用Golang開發(fā)其云計算相關(guān)產(chǎn)品。 跟著世界級巨人的腳步應(yīng)該不至于走錯方向育叁,而且在學(xué)習(xí)Golang的過程中迅脐,發(fā)現(xiàn)Golang入門非常簡單 。另外豪嗽,云風(fēng)博客中曾說過這樣一句話:“我發(fā)現(xiàn)我花了四年時間錘煉自己用 C 語言構(gòu)建系統(tǒng)的能力谴蔑,試圖找到一個規(guī)范,可以更好的編寫軟件龟梦。結(jié)果發(fā)現(xiàn)只是對 Go 的模仿隐锭。缺乏語言層面的支持,只能是一個拙劣的模仿计贰∏账”參考?https://blog.codingnow.com/2010/11/go_prime.html
go語言Mac安裝
Go有多種安裝方式:
Go源碼安裝:這是一種標準的軟件安裝方式。對于經(jīng)常使用Unix類系統(tǒng)的用戶躁倒,尤其對于開發(fā)者來說荞怒,從源碼安裝可以自己定制洒琢。
Go標準包安裝:Go提供了方便的安裝包,支持Windows褐桌、Linux衰抑、Mac等系統(tǒng)。這種方式適合快速安裝荧嵌,可根據(jù)自己的系統(tǒng)位數(shù)下載好相應(yīng)的安裝包呛踊,一路next就可以輕松安裝了。推薦這種方式
第三方工具安裝:目前有很多方便的第三方軟件包工具完丽,例如Ubuntu的apt-get和wget恋技、Mac的homebrew等。這種安裝方式適合那些熟悉相應(yīng)系統(tǒng)的用戶逻族。
我們這里只介紹?homebrew 的安裝方式蜻底,我感覺這種最為簡單。
Homebrew是一款Mac OS平臺下的軟件包管理工具聘鳞,擁有安裝薄辅、卸載、更新抠璃、查看站楚、搜索等很多實用的功能。簡單的一條指令搏嗡,就可以實現(xiàn)包管理窿春,而不用你關(guān)心各種依賴和文件路徑的情況,十分方便快捷采盒。
Install Homebrew旧乞,參考 https://brew.sh/
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
安裝Homebrew 之后,安裝golang磅氨。
$ brew update && brew upgrade?
$ brew install go
打開終端尺栖,輸入下面命令查看是否安裝成功
go version
如果顯示類似的?
go version go1.11 darwin/amd64
那么恭喜你,安裝成功烦租。
go 環(huán)境配置
1.打開終端延赌,cd ~進入主目錄
2.ls -all查看所有文件,看是否存在.bash_profile文件
3.如果不存在叉橱,則執(zhí)行touch .bash_profile新建
4.如果存在挫以,則執(zhí)行vi .bash_profile打開進行編輯
在文件中添加如下參數(shù)
export GOPATH=/Users/xxxxx/Go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN
保存編輯,然后在執(zhí)行source ~/.bash_profile赏迟,完成環(huán)境變量的配置
go env查看我們配置成功后的環(huán)境變量
?GOPATH與工作空間
go 有三個子目錄這個目錄用來存放Go源碼屡贺,Go的可運行文件,以及相應(yīng)的編譯之后的包文件。所以這個目錄下面有三個子目錄:src甩栈、bin泻仙、pkg
bin文件夾存放go install命名生成的可執(zhí)行文件,可以把$GOPATH/bin路徑加入到PATH環(huán)境變量里量没,就和我們上面配置的$GOROOT/bin一樣玉转,這樣就可以直接在終端里使用我們go開發(fā)生成的程序了。
pkg文件夾是存在go編譯生成的文件殴蹄。
src存放的是我們的go源代碼究抓,不同工程項目的代碼以包名區(qū)分。
go項目工程結(jié)構(gòu)
配置好工作目錄后袭灯,就可以編碼開發(fā)了刺下,在這之前,我們看下go的通用項目結(jié)構(gòu),這里的結(jié)構(gòu)主要是源代碼相應(yīng)地資源文件存放目錄結(jié)構(gòu)稽荧。
我們知道源代碼都是存放在GOPATH的src目錄下橘茉,那么多個多個項目的時候,怎么區(qū)分呢姨丈?答案是通過包畅卓,使用包來組織我們的項目目錄結(jié)構(gòu)。
如上蟋恬,src目錄下跟著一個個域名命名的文件夾翁潘。再以github.com文件夾為例,它里面又是以github用戶名命名的文件夾歼争,用于存儲屬于這個github用戶編寫的go源代碼拜马。
那么我們?nèi)绾我靡粋€包呢,也就是go里面的import沐绒。其實非常簡單一膨,通過包路徑,包路徑就是從src目錄開始洒沦,逐級文件夾的名字用/連起來就是我們需要的包名,比如:
Hello World
都準備好了价淌,讓我們創(chuàng)建一個hello項目申眼,測試一下。
Go版Hello World非常簡單蝉衣。在src/hellotest/目錄下運行g(shù)o run hello.go命令就可以看到打印的輸出Hello World
下面解釋下這段代碼括尸。
1.package 是一個關(guān)鍵字,定義一個包病毡,和Java里的package一樣濒翻,也是模塊化的關(guān)鍵。?2. main包是一個特殊的包名,它表示當前是一個可執(zhí)行程序有送,而不是一個庫淌喻。?
3. import 也是一個關(guān)鍵字,表示要引入的包雀摘,和Java的import關(guān)鍵字一樣裸删,引入后才可以使用它。?
4. fmt是一個包名阵赠,這里表示要引入fmt這個包涯塔,這樣我們就可以使用它的函數(shù)了。
?5. main函數(shù)是主函數(shù)清蚀,表示程序執(zhí)行的入口匕荸,Java也有同名函數(shù),但是多了一個String[]類型的參數(shù)枷邪。?
6. Println是fmt包里的函數(shù)榛搔,和Java里的system.out.println作用類似,這里輸出一段文字齿风。
整段代碼非常簡潔药薯,關(guān)鍵字、函數(shù)救斑、包等和Java非常相似童本,不過注意,go是不需要以;(分號)結(jié)尾的脸候。