Go語言的優缺點及其掃盲 1. go語言介紹 2. Go語言的主要特徵 3. Go的成功案例

1. go語言介紹

1.1.語言爲併發而生

go語言(或 Golang)是Google開發的開源編程語言,誕生於2006年1月2日下午15點4分5秒,於2009年11月開源,2012年發佈go穩定版。

Go語言在多核併發上擁有原生的設計優勢,Go語言從底層原生支持併發,無須第三方庫、開發者的編程技巧和開發經驗。

go是非常年輕的一門語言,它的主要目標是“兼具Python 等動態語言的開發速度和C/C++等編譯型語言的性能與安全性”

很多公司,特別是中國的互聯網公司,即將或者已經完成了使用 Go 語言改造舊系統的過程。

經過 Go 語言重構的系統能使用更少的硬件資源獲得更高的併發和I/O吞吐表現。

充分挖掘硬件設備的潛力也滿足當前精細化運營的市場大環境。

Go語言的併發是基於 goroutine 的,goroutine 類似於線程,但並非線程。

可以將 goroutine 理解爲一種虛擬線程。

Go 語言運行時會參與調度 goroutine,並將 goroutine 合理地分配到每個 CPU 中,最大限度地使用CPU性能。

開啓一個goroutine的消耗非常小(大約2KB的內存),你可以輕鬆創建數百萬個goroutine。

goroutine的特點:

1.goroutine具有可增長的分段堆棧。這意味着它們只在需要時纔會使用更多內存。

2.goroutine的啓動時間比線程快。

3.goroutine原生支持利用channel安全地進行通信。

4.goroutine共享數據結構時無需使用互斥鎖。

1.2.Go語言簡單易學

1.2.1.語法簡潔

Go 語言簡單易學,學習曲線平緩,不需要像 C/C++ 語言動輒需要兩到三年的學習期。

Go 語言被稱爲“互聯網時代的C語言”,Go 語言的風格類似於C語言,其語法在C語言的基礎上進行了大幅的簡化,去掉了不需要的表達式括號,循環也只有 for 一種表示方法,就可以實現數值、鍵值等各種遍歷。

1.2.2.代碼風格統一

Go 語言提供了一套格式化工具——go fmt。一些 Go 語言的開發環境或者編輯器在保存時,都會使用格式化工具進行修改代碼的格式化,這樣就保證了不同開發者提交的代碼都是統一的格式。(吐槽下:再也不用擔心那些看不懂的黑魔法了…)

1.2.3.開發效率高

Go語言實現了開發效率與執行效率的完美結合,讓你像寫Python代碼(效率)一樣編寫C代碼(性能)。

1.3.Go適合做什麼

  • 服務端開發
  • 分佈式系統,微服務
  • 網絡編程
  • 區塊鏈開發
  • 內存KV數據庫,例如boltDB、levelDB
  • 雲平臺

1.4.學習Go語言的前景

目前Go語言已經⼴泛應用於人工智能、雲計算開發、容器虛擬化、⼤數據開發、數據分析及科學計算、運維開發、爬蟲開發、遊戲開發等領域。

Go語言簡單易學,天生支持併發,完美契合當下高併發的互聯網生態。Go語言的崗位需求持續高漲,目前的Go程序員數量少,待遇好。

抓住趨勢,要學會做一個領跑者而不是跟隨者。

國內Go語言的需求潛力巨大,目前無論是國內大廠還是新興互聯網公司基本上都會有Go語言的崗位需求。

2. Go語言的主要特徵

2.1.來歷

很久以前,有一個IT公司,這公司有個傳統,允許員工擁有20%自由時間來開發實驗性項目。

在2007的某一天,公司的幾個大牛,正在用c++開發一些比較繁瑣但是核心的工作,主要包括龐大的分佈式集羣,大牛覺得很鬧心,後來c++委員會來他們公司演講,說c++將要添加大概35種新特性。

這幾個大牛的其中一個人,名爲:Rob Pike,聽後心中一萬個xxx飄過,“c++特性還不夠多嗎?簡化c++應該更有成就感吧”。

於是乎,Rob Pike和其他幾個大牛討論了一下,怎麼解決這個問題,過了一會,Rob Pike說要不我們自己搞個語言吧,名字叫“go”,非常簡短,容易拼寫。

其他幾位大牛就說好啊,然後他們找了塊白板,在上面寫下希望能有哪些功能(詳見文尾)。

接下來的時間裏,大牛們開心的討論設計這門語言的特性,經過漫長的歲月,他們決定,以c語言爲原型,以及借鑑其他語言的一些特性,來解放程序員,解放自己,然後在2009年,go語言誕生。

2.2.思想

Less can be more 大道至簡,小而蘊真 讓事情變得複雜很容易,讓事情變得簡單才難 深刻的工程文化

2.3.優點

自帶gc。

靜態編譯,編譯好後,扔服務器直接運行。

簡單的思想,沒有繼承,多態,類等。

豐富的庫和詳細的開發文檔。

語法層支持併發,和擁有同步併發的channel類型,使併發開發變得非常方便。

簡潔的語法,提高開發效率,同時提高代碼的閱讀性和可維護性。

超級簡單的交叉編譯,僅需更改環境變量。

Go 語言是谷歌 2009 年首次推出並在 2012 年正式發佈的一種全新的編程語言,可以在不損失應用程序性能的情況下降低代碼的複雜性。

谷歌首席軟件工程師羅布派克(Rob Pike)說:我們之所以開發 Go,是因爲過去10多年間軟件開發的難度令人沮喪。

Google 對 Go 寄予厚望,其設計是讓軟件充分發揮多核心處理器同步多工的優點,並可解決面向對象程序設計的麻煩。它具有現代的程序語言特色,如垃圾回收,幫助開發者處理瑣碎但重要的內存管理問題。

Go 的速度也非常快,幾乎和 C 或 C++ 程序一樣快,且能夠快速開發應用程序。

2.4.Go語言的主要特徵:

    1.自動立即回收。
    2.更豐富的內置類型。
    3.函數多返回值。
    4.錯誤處理。
    5.匿名函數和閉包。
    6.類型和接口。
    7.併發編程。
    8.反射。
    9.語言交互性。

2.5.Golang文件名:

所有的go源碼都是以 ".go" 結尾

2.6.Go言命名:

1.Go的函數、變量、常量、自定義類型、包(package)的命名方式遵循以下規則:

1)首字符可以是任意的Unicode字符或者下劃線
2)剩餘字符可以是Unicode字符、下劃線、數字
3)字符長度不限

2.Go只有25個關鍵字

    break        default      func         interface    select

    case         defer        go           map          struct

    chan         else         goto         package      switch

    const        fallthrough  if           range        type

    continue     for          import       return       var

3.Go還有37個保留字

    Constants:    true  false  iota  nil

    Types:    int  int8  int16  int32  int64  

              uint  uint8  uint16  uint32  uint64  uintptr

              float32  float64  complex128  complex64

              bool  byte  rune  string  error

    Functions:   make  len  cap  new  append  copy  close  delete

                 complex  real  imag

                 panic  recover

4.可見性:

1)聲明在函數內部,是函數的本地值,類似private
2)聲明在函數外部,是對當前包可見(包內所有.go文件都可見)的全局值,類似protect
3)聲明在函數外部且首字母大寫是所有包可見的全局值,類似public

2.7Go語言聲明:

有四種主要聲明方式:

var(聲明變量)
const(聲明常量)
type(聲明類型)
func(聲明函數)

Go的程序是保存在多個.go文件中,文件的第一行就是package XXX聲明,用來說明該文件屬於哪個包(package),package聲明下來就是import聲明,再下來是類型,變量,常量,函數的聲明。

2.8.Go項目構建及編譯

一個Go工程中主要包含以下三個目錄:

src:源代碼文件
pkg:包文件
bin:相關bin文件

1: 建立工程文件夾 goproject

2: 在工程文件夾中建立src,pkg,bin文件夾

3: 在GOPATH中添加projiect路徑 例 e:/goproject

4: 如工程中有自己的包examplepackage,那在src文件夾下建立以包名命名的文件夾 例 examplepackage

5:在src文件夾下編寫主程序代碼代碼 goproject.go

6:在examplepackage文件夾中編寫 examplepackage.go 和 包測試文件 examplepackage_test.go

7:編譯調試包

go build examplepackage

go test examplepackage

go install examplepackage

這時在pkg文件夾中可以發現會有一個相應的操作系統文件夾如windows_386z, 在這個文件夾中會有examplepackage文件夾,在該文件中有examplepackage.a文件

8:編譯主程序

go build goproject.go

成功後會生成goproject.exe文件

至此一個Go工程編輯成功。

2.9. go 編譯問題

golang的編譯使用命令 go build , go install;除非僅寫一個main函數,否則還是準備好目錄結構; GOPATH=工程根目錄;其下應創建src,pkg,bin目錄,bin目錄中用於生成可執行文件,pkg目錄中用於生成.a文件; golang中的import name,實際是到GOPATH中去尋找name.a, 使用時是該name.a的源碼中生命的package 名字;這個在前面已經介紹過了。

注意點:

1.系統編譯時 go install abc_name時,系統會到GOPATH的src目錄中尋找abc_name目錄,然後編譯其下的go文件;

2.同一個目錄中所有的go文件的package聲明必須相同,所以main方法要單獨放一個文件,否則在eclipse和liteide中都會報錯;
編譯報錯如下:(假設test目錄中有個main.go 和mymath.go,其中main.go聲明package爲main,mymath.go聲明packag 爲test);

    $ go install test

    can't load package: package test: found packages main (main.go) and test (mymath.go) in /home/wanjm/go/src/test

    報錯說 不能加載package test(這是命令行的參數),因爲發現了兩個package,分別時main.go 和 mymath.go;

3.對於main方法,只能在bin目錄下運行 go build path_tomain.go; 可以用-o參數指出輸出文件名;

4.可以添加參數 go build -gcflags "-N -l" ,可以更好的便於gdb;詳細參見 http://golang.org/doc/gdb

5.gdb全局變量主一點。 如有全局變量 a;則應寫爲 p 'main.a';注意但引號不可少;

3. Go的成功案例

Nsq:Nsq 是由Go語言開發的高性能、高可用消息隊列系統,性能非常高,每天能處理數十億條的消息;

Docker:基於lxc的一個虛擬打包工具,能夠實現PAAS平臺的組建。

Packer:用來生成不同平臺的鏡像文件,例如VM、vbox、AWS等,作者是vagrant的作者

Skynet:分佈式調度框架

Doozer:分佈式同步工具,類似ZooKeeper

Heka:mazila開源的日誌處理系統

Cbfs:couchbase開源的分佈式文件系統

Tsuru:開源的PAAS平臺,和SAE實現的功能一模一樣

Groupcache:memcahe作者寫的用於Google下載系統的緩存系統

God:類似redis的緩存系統,但是支持分佈式和擴展性

Gor:網絡流量抓包和重放工具

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章