我先想分析一下現在有哪些公司使用go 語言,go語言在實際開發中有哪些使用場景,為什么要從其他語言轉換成go語言。我覺得這是學習一門新語言一個很重要的問題。
Go大概09年面世以來,已經有很多公司開始使用Go語言開發自己的服務,甚至完全轉向Go開發,也誕生了很多基于Go的服務和應用,比如Dokcer、k8s等,現在我們看下,有哪些大公司在用Go語言了。
【Google】? ?
這個不用多做介紹,作為開發Go語言的公司,當仁不讓。Google基于Go有很多優秀的項目,比如:https://github.com/kubernetes/kubernetes?,大家也可以在Github上?https://github.com/google/?查看更多Google的Go開源項目。
【七牛】? ? ? ? ? ? ? ? ?
整個產品(包括基礎服務、Web端、統計平臺、各類小工具等等),Go代碼行數占比:99.9%。七牛算是國內第一家選 Go 語言做服務端的公司。早在2011年,當Go語法還沒完全穩定下來的情況下,七牛就已經選擇將Go作為存儲服務端的主題語言。關于這點,七牛CEO許式偉談到:“我曾多次公開分享過Go語言的亮點,包括它的并發編程模型、對軟件工程的支持,以及對編程哲學的重塑。在我看來,Go對并發與分布式的支持算不上特別,所有新興的語言也都有工程化的思想,所以編程哲學的重塑才是Go語言獨樹一幟的根本原因,其它語言仍難以擺脫OOP或函數式編程的烙印,只有Go完全放棄了這些,對編程范式重新思考,對熱門的面向對象編程提供極度簡約但卻完備的支持。Go把其全新的編程理念,稱為面向連接的語言。作為一名老程序員,我認為Go的編程哲學獨具魅力,超越其它新興語言。前VMware云平臺的首席技術官Derek Collison,曾在2012年斷言Go語言將在兩年內制霸云計算。我認為他的說法略有激進,但和實際的發展趨勢吻合,Docker、CoreOS等新的云計算基礎設施都基于Go。在我看來,Go是互聯網時代的C語言,不僅會制霸云計算,10年內將會制霸整個IT領域?!?參考http://digi.163.com/14/1121/22/ABJV4BNU001618JV.html
【新浪微博】
中間件和彈性調度用 Java 和 Go 編寫,微博視頻轉碼及存儲服務用 Go 編寫。
【京東】
京東云消息推送系統用 Go 編寫
【嗶哩嗶哩】
參考:https://www.zhihu.com/question/65782086?如何看待嗶哩嗶哩用go語言重寫所有的java后臺工程?
【百度】
百度運維的一個BFE項目,負責前端流量的接入。他們的負責人在2016年有分享,大家可以看下這個?http://www.infoq.com/cn/presentations/application-of-golang-in-baidu-frontend?.其次就是百度的消息系統,從其最近的Golang招聘介紹就可以看出來. > 負責公司手百消息通訊系統服務器端開發及維護
【小米?】
小米對Golang的支持,莫過于運維監控系統的開源,也就是?http://open-falcon.com/?。此外,小米互娛、小米商城、小米視頻、小米生態鏈等團隊都在使用Golang。
Go適合用來做什么? ?
服務器編程:以前你如果使用C或者C++做的那些事情,用Go來做很合適,例如處理日志、數據打包、虛擬機處理、文件系統等。
分布式系統:數據庫代理器等 。
網絡編程:這一塊目前應用最廣,包括Web應用、API應用、下載應用、? 內存數據庫,前一段時間google開發的groupcache,couchbase的部分組建。
云平臺:目前國外很多云平臺在采用Go開發,CloudFoundy的部分組建,前VMare的技術總監自己出來搞的apcera云平臺。??
Go 的優點的體會 ?
為什么我會選擇Golang呢?
其實我在做出這個選擇之前已經花了大量時間做過詳盡調研。 國外如Google、AWS、Cloudflare、CoreOS等,國內如七牛、阿里等都已經開始大規模使用Golang開發其云計算相關產品。 跟著世界級巨人的腳步應該不至于走錯方向,而且在學習Golang的過程中,發現Golang入門非常簡單 。另外,云風博客中曾說過這樣一句話:“我發現我花了四年時間錘煉自己用 C 語言構建系統的能力,試圖找到一個規范,可以更好的編寫軟件。結果發現只是對 Go 的模仿。缺乏語言層面的支持,只能是一個拙劣的模仿?!眳⒖?https://blog.codingnow.com/2010/11/go_prime.html
go語言Mac安裝
Go有多種安裝方式:
Go源碼安裝:這是一種標準的軟件安裝方式。對于經常使用Unix類系統的用戶,尤其對于開發者來說,從源碼安裝可以自己定制。
Go標準包安裝:Go提供了方便的安裝包,支持Windows、Linux、Mac等系統。這種方式適合快速安裝,可根據自己的系統位數下載好相應的安裝包,一路next就可以輕松安裝了。推薦這種方式
第三方工具安裝:目前有很多方便的第三方軟件包工具,例如Ubuntu的apt-get和wget、Mac的homebrew等。這種安裝方式適合那些熟悉相應系統的用戶。
我們這里只介紹?homebrew 的安裝方式,我感覺這種最為簡單。
Homebrew是一款Mac OS平臺下的軟件包管理工具,擁有安裝、卸載、更新、查看、搜索等很多實用的功能。簡單的一條指令,就可以實現包管理,而不用你關心各種依賴和文件路徑的情況,十分方便快捷。
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 環境配置
1.打開終端,cd ~進入主目錄
2.ls -all查看所有文件,看是否存在.bash_profile文件
3.如果不存在,則執行touch .bash_profile新建
4.如果存在,則執行vi .bash_profile打開進行編輯
在文件中添加如下參數
export GOPATH=/Users/xxxxx/Go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN
保存編輯,然后在執行source ~/.bash_profile,完成環境變量的配置
go env查看我們配置成功后的環境變量
?GOPATH與工作空間
go 有三個子目錄這個目錄用來存放Go源碼,Go的可運行文件,以及相應的編譯之后的包文件。所以這個目錄下面有三個子目錄:src、bin、pkg
bin文件夾存放go install命名生成的可執行文件,可以把$GOPATH/bin路徑加入到PATH環境變量里,就和我們上面配置的$GOROOT/bin一樣,這樣就可以直接在終端里使用我們go開發生成的程序了。
pkg文件夾是存在go編譯生成的文件。
src存放的是我們的go源代碼,不同工程項目的代碼以包名區分。
go項目工程結構
配置好工作目錄后,就可以編碼開發了,在這之前,我們看下go的通用項目結構,這里的結構主要是源代碼相應地資源文件存放目錄結構。
我們知道源代碼都是存放在GOPATH的src目錄下,那么多個多個項目的時候,怎么區分呢?答案是通過包,使用包來組織我們的項目目錄結構。
如上,src目錄下跟著一個個域名命名的文件夾。再以github.com文件夾為例,它里面又是以github用戶名命名的文件夾,用于存儲屬于這個github用戶編寫的go源代碼。
那么我們如何引用一個包呢,也就是go里面的import。其實非常簡單,通過包路徑,包路徑就是從src目錄開始,逐級文件夾的名字用/連起來就是我們需要的包名,比如:
Hello World
都準備好了,讓我們創建一個hello項目,測試一下。
Go版Hello World非常簡單。在src/hellotest/目錄下運行go run hello.go命令就可以看到打印的輸出Hello World
下面解釋下這段代碼。
1.package 是一個關鍵字,定義一個包,和Java里的package一樣,也是模塊化的關鍵。?2. main包是一個特殊的包名,它表示當前是一個可執行程序,而不是一個庫。?
3. import 也是一個關鍵字,表示要引入的包,和Java的import關鍵字一樣,引入后才可以使用它。?
4. fmt是一個包名,這里表示要引入fmt這個包,這樣我們就可以使用它的函數了。
?5. main函數是主函數,表示程序執行的入口,Java也有同名函數,但是多了一個String[]類型的參數。?
6. Println是fmt包里的函數,和Java里的system.out.println作用類似,這里輸出一段文字。
整段代碼非常簡潔,關鍵字、函數、包等和Java非常相似,不過注意,go是不需要以;(分號)結尾的。