--------------------------------------------------------------------------
優勢:

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

}