GO語言學習筆記一

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

GO語言學習筆記一


--------------------------------------------------------------------------

優勢:


1.它是系統層級的語言,靜態編譯,是C系列語言。

2.具有很多內建庫,使用起來和Python很類似。

3.文法足夠簡單,入門學習成本很低,適合我這樣從PHP和Python切換過來的人。

4.速度快,就拿簡單的頁面來說,我用PHP開發並發能夠達到500很好了,但是用Go輕鬆就到上萬,這是無法比擬的效能


提升,而且用Go開發的效率和PHP差不多。

5.出自Google之手,而且有一幫牛人在維護,基於BSD開源,社區活躍。

--------------------------------------------------------------------------

缺點:


1.有些庫不成熟,例像處理。

2.cgo在Window系統下面編譯很麻煩,就拿SQLite的資料庫驅動來說,在Window下面編譯就會遇到很大的麻煩。

3.runtime還不夠成熟,GC還不是很好,不過聽說Go 1.1版本會有比較大的效能提升。

4.Go的開源項目還不夠多。我覺得一個語言的發展不僅僅是語言本身出色,還要有大公司推動或者好的項目推動。

--------------------------------------------------------------------------

開源項目


開源項目給我很多自信,舉幾個開源系統:

vitess(YouTube的資料庫proxy系統)、

nsq(bitly的一個即時資訊處理系統)、

skynet(輕量級的分布式服務架構)、

七牛公司全部用Go開發、

360開發的類iMessage應用,支援上千萬使用者,同時單台伺服器長連80w,

這些系統都是他們線上跑的,這給我更大的信心能夠用Go來開發高效能,高穩定的應用。


--------------------------------------------------------------------------

為什麼Go被稱為互連網時代的C呢


我認為是Go在語言層級上支援了並發,通過簡單的關鍵字go就可以充分利用多核,這對於硬體不斷髮展的時代,這麼簡


單就可以充分利用硬體的多核,這是多麼重要的一個特性啊!但是相比C而言,Go還缺少一些高品質的第三方包,例如


OpenGL等,所以Go內部也支援用cgo直接調用C語言編寫的代碼。



同時我還開發了兩個開源的項目:


beego:一個模仿Python的tornado系統開發的Go開發架構,現在開發的幾個系統都是基於該架構開發。

beedb: 一個Go語言的ORM庫,可以像操作struct一樣操作資料庫資料。目前我們內部的API介面我就是採用了這個ORM


開發的。



1.書籍《go語言程式設計》

1.1 go語言是一門靜態編譯型的語言。編譯速度非常快,明顯快於c,c++。

    go語言的官方編譯器是gc。

    查看官方文檔: 運行指令 godoc -http=:8000 在瀏覽器中開啟http://localhost:8000就可以查看go語言官方文


檔。

    go語言支援在程式中以cgo工具的形式調用外部的c語言代碼。


1.2 編輯

    go語言關鍵字和操作符都使用ASCII編碼字元,但是GO語言中的標識符可以使任一Unicode編碼字串,所以go語言

     開發人員可以再代碼中自由地使用它們的母語。

編譯

go語言的編譯速度超快,所以go語言可以作為類UNIX系統上的#!指令碼使用。將#!/usr/bin/env gonow 或者

#!/usr/bin/env gorun加到main()所在的.go檔案開始處即可

樣本

www.qtrac.eu/gobook.html 得到本書所有的源碼。

環境變數設定

在.bashrc檔案中添加以下行:

export GOROOT=$HOME/opt/go

export PAHT=$PATH:$GOROOT/bin

http://www.qtrac.eu/gobook-1.0.zip




gofmt -w src 可以格式化整個項目



如何查看相應的package文檔?

如果是 builtin包,那麼執行godoc builtin

如果是 http 包,  那麼執行godoc net/http

如果查看某一個包裡面的函數,則執行godoc fmt Printf,也可以查看相應的代碼,執行 godoc -src fmt Printf




-----------------------------------

UTF-8 天生支援utf-8字串和標示符,因為utf-8的發明者也是go語言的發明者。




並發

 goroutine 是go語言並行設計的核心,goroutine說到底就是線程,但是它比線程更小,十幾個goroutine可能

體現在底層就是五六個線程,go語言內部幫你實現了這些goroutine之間的記憶體共用。

 執行goroutine只需極小的棧記憶體(4--5k)。

  

 預設情況下,調度器僅使用單線程。想要發揮多核處理器的並行,需要在我們的程式中顯示調用

 runtime.GOMAXPROCS(n) 告知調度器同時使用多個線程。




channel 

  1.無緩衝的 channel

    預設情況下,channel接收和發送資料都是阻塞的,除非另一端已經準備好,這樣就使得goroutine同步變得更加簡


單,而不需要顯式的lock。

    所謂阻塞,也就說如果讀取,它就會被阻塞,直到有資料接收;任何發送也會被阻塞,直到讀資料被讀出。

    無緩衝的channel是在多個goroutine之間同步最棒的工具。


  2.有緩衝的channel

    ch := make(chan bool ,4)建立了一個可以儲存4個元素的bool型channel 。在這個channel中,前4個元素可以無


阻塞的寫入。當寫入第5個元素時,代碼將會阻塞,直到其他goroutine從channel中讀取一些元素,騰出空間。



range 和close


  func Test(){


  c := make(chan int, 10)

  go fibonacci(cap(c) ,c)

 

  for i := range c { //使用range操作緩衝類型的channel

  fmt.Println(i)

  }


}


func fibonacci(n int,c chan int){

x,y := 1,1

for i := 0 ;i < n ;i++ {

c <- x

x,y = y,x+y

}

close(c) //在生產者的地方關閉channel,而不是在消費的地方去關閉它,這樣容易起panic。

}



      

select


func Test(){


  c    := make(chan int)

  quit := make(chan int)

 

  go func(){

  for  i :=0 ;i<10;i++{

  fmt.Println(<-c)

  }

  quit <- 0

  }()

 

fibonacci(c,quit)


}


func fibonacci(c,quit chan int){

x,y := 1,1


for {

select {//*select 預設是阻塞的,只要當監聽的channel中發送或者接收可以進行時,才會運行。

case c <-x ://*當多個channel都準備好的時候,select是隨機播放一個執行的。

x,y = y,x+y

case <-quit:

fmt.Println("quit")

return

default:

fmt.Println("do some thing ");

}

}

}



逾時 


func Test(){

c := make(chan int)

o := make(chan bool)

go func(){

for {

select {

case v := <-c :

fmt.Println(v)

case <- time.After(5 * time.Second) :

fmt.Println("timeout")

o <- true

break

}

}

}()

<- o


}




      


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.