背景介紹:
為什么要開發go語言呢?
Go語言官方自稱,之所以開發go語言,是因為”近10年來的開發程序之難讓我們有點沮喪”.
Go語言是谷歌推出的一種全新的編程語言,可以在不損失應用程序性能的情況下降低代碼的復雜性。谷歌首席軟件工程師羅布派克(Rob Pike)說:我們之所以開發Go,是因為過去10多年間軟件開發的難度令人沮喪。派克表示,和今天的C++或C一樣,Go是一種系統語言。他解釋道,“使用它可以進行快速開發,同時它還是一個真正的編譯語言,我們之所以現在將其開源,原因是我們認為它已經非常有用和強大。”
2007年,谷歌把Go作為一個20%項目開始研發,即讓員工抽出本職工作之外時間的20%, 投入在該項目上。除了派克外,該項目的成員還有其他谷歌工程師也參與研發。
派克表示,編譯后Go代碼的運行速度與C語言非常接近,而且編譯速度非常快,就像在使用一個交互式語言。現有編程語言均未專門對多核處理器進行優化。Go就是谷歌工程師為這類程序編寫的一種語言。它不是針對編程初學者設計的,但學習使用它也不是非常困難。Go支持面向對象,而且具有真正的閉包(closures)和反射 (reflection)等功能。
在谷歌公開發布的所有網絡應用中,均沒有使用Go,但是谷歌已經使用該語言開發了幾個內部項目。派克表示,Go是否會對谷歌即將推出的Chrome OS產生影響,還言之尚早,不過Go的確可以和Native Client配合使用。他表示“Go可以讓應用完美的運行在瀏覽器內。”例如,使用Go可以更高效的實現Wave,無論是在前端還是后台。
Go 同時具有兩種編譯器,一種是建立在GCC基礎上的Gccgo,另外一種是分別針對64位x64和32位x86計算機的一套編譯器(6g和8g)。谷歌目前正在研發其對ARM芯片和Android設備的支持。派克表示,“Android手機存在的問題是,我們一直沒有一個數學協處理器。”
閉包: 就是能夠讀取其他函數內部變量的函數。例如在javascript中,只有函數內部的子函數才能讀取局部變量,所以閉包可以理解成“定義在一個函數內部的函數“。在本質上,閉包是將函數內部和函數外部連接起來的橋梁
反射:
講反射時必須先了解JVM,
例:Object o=new Object();運行起來:
首先JVM會啟動,你的代碼會編譯成一個.class文件,然后被類加載器加載進jvm的內存中,你的類Object加載到方法區中,創建了Object類的class對象到堆中,注意這個不是new出來的對象,而是類的類型對象,每個類只有一個class對象,作為方法區類的數據結構的接口。jvm創建對象前,會先檢查類是否加載,尋找類對應的class對象,若加載好,則為你的對象分配內存,初始化也就是代碼:new Object()。題主想想上面的程序對象是自己new的,程序相當於寫死了給jvm去跑
反射是什么呢?
對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱為java語言的反射機制.
當我們的程序在運行時,需要動態的加載一些類這些類可能之前用不到所以不用加載到jvm,而是在運行時根據需要才加載,這樣的好處對於服務器來說不言而喻,舉個例子我們的項目底層有時是用mysql,有時用oracle,需要動態地根據實際情況加載驅動類,這個時候反射就有用了,假設 com.java.dbtest.myqlConnection,com.java.dbtest.oracleConnection這兩個類我們要用,這時候我們的程序就寫得比較動態化,通過Class tc = Class.forName("com.java.dbtest.TestConnection");通過類的全類名讓jvm在服務器中找到並加載這個類,而如果是oracle則傳入的參數就變成另一個了。這時候就可以看到反射的好處了,這個動態性就體現出java的特性了!舉多個例子,大家如果接觸過spring,會發現當你配置各種各樣的bean時,是以配置文件的形式配置的,你需要用到哪些bean就配哪些,spring容器就會根據你的需求去動態加載,你的程序就能健壯地運行。
簡介:
Go 是一個開源的編程語言,它能讓構造簡單、可靠且高效的軟件變得容易。
Go是從2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持開發,后來還加入了Ian Lance Taylor, Russ Cox等人,並最終於2009年11月開源,在2012年早些時候發布了Go 1穩定版本。現在Go的開發已經是完全開放的,並且擁有一個活躍的社區
目標:
Go的目標是希望提升現有編程語言對程序庫等依賴性(dependency)的管理,這些軟件元素會被應用程序反復調用。由於存在並行編程模式,因此這一語言也被設計用來解決多處理器的任務。
谷歌大約2007年開始開發Go,並於2008年投入了一組全職員工。谷歌當初將該語言設計為一款系統編程語言,可以被用於網絡服務器、存儲系統和數據庫中。但是谷歌認為,該語言還有望被用於其它領域。
硬件架構
Go語言設計支持主流的32位和64位的x86平台,同時也支持32位的ARM架構。
操作系統
Go語言在Go1版本上支持Windows, 蘋果Mac OS X, Linux和FreeBSD操作系統。
go語言的歷程:
2007年,谷歌工程師Rob Pike, Ken Thompson和Robert Griesemer開始設計一門全新的語言,這是Go語言的最初原型。[1]
2009年11月10日,Go語言以開放源代碼的方式向全球發布。[1]
2011年3月16日,Go語言的第一個穩定(stable)版本r56發布。[2]
2012年3月28日,Go語言的第一個正式版本Go1發布。[2]
2013年4月04日,Go語言的第一個Go 1.1beta1測試版發布。[3]
2013年4月08日,Go語言的第二個Go 1.1beta2測試版發布。[3]
2013年5月02日,Go語言Go 1.1RC1版發布。[4]
2013年5月07日,Go語言Go 1.1RC2版發布。[5]
2013年5月09日,Go語言Go 1.1RC3版發布。 [6]
2013年5月13日,Go語言Go 1.1正式版發布。
2013年9月20日,Go語言Go 1.2RC1版發布。[7]
2013年12月1日,Go語言Go 1.2正式版發布。[8]
2014年6月18日,Go語言Go 1.3版發布。[9]
2014年12月10日,Go語言Go 1.4版發布。[10]
2015年8月19日,Go語言Go 1.5版發布,本次更新中移除了”最后殘余的C代碼”。[11]
2016年2月17日,Go語言Go 1.6版發布。[12]
2016年8月15日,Go語言Go 1.7版發布。[13]
2017年2月17日,Go語言Go 1.8版發布。[14]
2017年8月24日,Go語言Go 1.9版發布。[15]
2018年2月16日,Go語言Go 1.10版發布。[16]
go語言特性與優勢:
特點:
簡潔 快速 安全
並行 有趣 開源,
- 保留但大幅度簡化指針: Golang 保留着C中值和指針的區別,但是對於指針繁瑣用法進行了大量的簡化,引入引用的概念。所以在 Golang 中,你幾乎不用擔心會因為直接操作內寸而引起各式各樣的錯誤。
2.多參數返回:
還記得在C里面為了回饋多個參數,不得不開辟幾段指針傳到目標函數中讓其操作么?在 Go 里面這是完全不必要的。而且多參數的支持讓 Go 無需使用繁瑣的 exceptions 體系,一個函數可以返回期待的返回值加上 error,調用函數后立刻處理錯誤信息,清晰明了。
3.Array, slice, map 等內置基本數據結構
Golang 最讓人贊嘆不易的特性,就是 interface 的設計。任何數據結構,只要實現了 interface 所定義的函數,自動就 implement 了這個 interface,沒有像 Java 那樣冗長的 class 申明,提供了靈活太多的設計度和 OO (面向對象)抽象度,讓你的代碼也非常干凈。
4.OO 面向對象: Golang 本質上不是面向對象語言,它還是過程化的。但是,在 Golang 中, 你可以很輕易的做大部分你在別的 OO 語言中能做的事,用更簡單清晰的邏輯。是的,在這里,不需要 class,仍然可以繼承,仍然可以多態,但是速度卻快得多。因為本質上,OO 在 Golang 中,就是普通的 struct 操作。
5.Goroutine : 如果你完全不了解 Goroutine,那么你只需要知道,這玩意是超級輕量級的類似線程的東西,但通過它,你不需要復雜的線程操作鎖操作,不需要 care 調度,就能玩轉基本的並行程序。在 Golang 里,觸發一個 routine 和 erlang spawn 一樣簡單。基本上要掌握 Golang,以 Goroutine 和 channel 為核心的內存模型是必須要懂的
優勢:
- 部署簡單: go編譯生成一個靜態可執行文件,除了glibc外沒有其他外部依賴,這讓部署變得異常方便,目標機器上只需要一個基礎的系統和必要的管理,監控工具,完全不用操心應用所需的各種包 庫的依賴關系,大大減輕維護的負擔.
- 並發性好:Goroutine和channel是編寫高並發的服務端軟件變得相當容易,很多情況下不需要考慮鎖機制以及相關的各種問題.單個go應用也能有效的利用多個cpu,並發執行的性能好.
- 良好的語言設計: 從學術角度講go語言其實非常平庸,不過支持很多高級的語言特征,但從工程角度,go語言的設計十分優秀,規范足夠簡單靈活,更重要的是go語言自帶完善的工具鏈,大大提高團隊的協作一致性.
- 執行性能好: 雖然不如c與java,但通常比原生的python應用還是高一個數量級的,適合編寫一些瓶頸業務,內存占用十分節省.
- 支持垃圾回收,這屬於動態語言的特性之一吧,雖然目前來說GC不算完美,但是足以應付我們所能遇到的大多數情況,特別是Go1.1之后的GC。
- 跨平台編譯,如果你寫的Go代碼不包含cgo,那么就可以做到window系統編譯linux的應用,如何做到的呢?Go引用了plan9的代碼,這就是不依賴系統的信息.
用途:
Go 語言被設計成一門應用於搭載 Web 服務器,存儲集群或類似用途的巨型中央服務器的系統編程語言。
對於高性能分布式系統領域而言,Go 語言無疑比大多數其它語言有着更高的開發效率。它提供了海量並行的支持,這對於游戲服務端的開發而言是再好不過了。
服務器編程,以前你如果使用C或者C++做的那些事情,用Go來做很合適,例如處理日志、數據打包、虛擬機處理、文件系統等。
分布式系統,數據庫代理器等網絡編程,這一塊目前應用最廣,包括Web應用、API應用、下載應用、
內存數據庫,前一段時間google開發的groupcache,couchbase的部分組建
雲平台,目前國外很多雲平台在采用Go開發,CloudFoundy的部分組建,前VMare的技術總監自己出來搞的apcera雲平台。
Go成功的項目:
nsq:bitly開源的消息隊列系統,性能非常高,目前他們每天處理數十億條的消息
docker:基於lxc的一個虛擬打包工具,能夠實現PAAS平台的組建。
packer:用來生成不同平台的鏡像文件,例如VM、vbox、AWS等,作者是vagrant的作者
skynet:分布式調度框架
Doozer:分布式同步工具,類似ZooKeeper
Heka:mazila開源的日志處理系統
cbfs:couchbase開源的分布式文件系統
tsuru:開源的PAAS平台,和SAE實現的功能一模一樣
groupcache:memcahe作者寫的用於Google下載系統的緩存系統
god:類似redis的緩存系統,但是支持分布式和擴展性
gor:網絡流量抓包和重放工具
各大公司的go語言應用:
這個不用多做介紹,作為開發Go語言的公司,當仁不讓。Google基於Go有很多優秀的項目,比如:https://github.com/kubernetes/kubernetes ,大家也可以在Github上 https://github.com/google/ 查看更多Google的Go開源項目。
Facebook也在用,為此他們還專門在Github上建立了一個開源組織facebookgo,大家可以通過https://github.com/facebookgo訪問查看facebook開源的項目,比如著名的是平滑升級的grace。
騰訊
騰訊作為國內的大公司,還是敢於嘗試的,尤其是Docker容器化這一塊,他們在15年已經做了docker萬台規模的實踐,具體可以參考http://www.infoq.com/cn/articles/tencent-millions-scale-docker-application-practice 。
主要職責是:
負責騰訊游戲藍鯨平台后台開發工作
負責容器相關的開發工作
和藍鯨平台,容器開發有關。騰訊作為主要使用C/C++的公司,使用Go會方便很多,也有很多優勢,不過日積月累的C/C++代碼很難改造,也不敢動,所以新業務會在Go方面嘗試。
百度
目前所知的百度的使用是在運維這邊,是百度運維的一個BFE項目,負責前端流量的接入。他們的負責人在2016年有分享,大家可以看下這個 http://www.infoq.com/cn/presentations/application-of-golang-in-baidu-frontend .
其次就是百度的消息系統,從其最近的Golang招聘介紹就可以看出來.
負責公司手百消息通訊系統服務器端開發及維護
京東
京東雲消息推送系統、雲存儲,以及京東商城等都有使用Go做開發。
小米
小米對Golang的支持,莫過於運維監控系統的開源,也就是 http://open-falcon.com/ 。
此外,小米互娛、小米商城、小米視頻、小米生態鏈等團隊都在使用Golang。
360
360對Golang的使用也不少,一個是開源的日志搜索系統Poseidon,托管在Github上,https://github.com/Qihoo360/poseidon.
還有360的推送團隊也在使用,他們還寫了篇博文在Golang的官方博客上 https://blog.golang.org/qihoo。
360直播在招聘Golang開發工程師。
美團、滴滴、新浪以及七牛等。一般的選擇,都是選擇用於自己公司合適的產品系統來做,比如消息推送的、監控的、容器的等,Golang特別適合做網絡並發的服務,這是他的強項,所以也是被優先用於這些項目。