青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Fork me on GitHub
隨筆 - 215  文章 - 13  trackbacks - 0
<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011


專注即時通訊及網游服務端編程
------------------------------------
Openresty 官方模塊
Openresty 標準模塊(Opm)
Openresty 三方模塊
------------------------------------
本博收藏大部分文章為轉載,并在文章開頭給出了原文出處,如有再轉,敬請保留相關信息,這是大家對原創作者勞動成果的自覺尊重!!如為您帶來不便,請于本博下留言,謝謝配合。

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

相冊

Awesome

Blog

Book

GitHub

Link

搜索

  •  

積分與排名

  • 積分 - 219730
  • 排名 - 117

最新評論

閱讀排行榜

http://www.tuicool.com/articles/za6F7zE
http://colobu.com/2016/11/05/golang-18-whats-coming/

譯自 tylerchr 的 What's Coming in Go 1.8 。

隨著Go 1.8 新特性的開發工作已經凍結,Go 1.8 將在2017年2月左右發布,現在讓我們看一些在Go 1.8更有趣的API的改變。

HTTP server connection draining

Brad Fitzpatrick最近 關閉了一個將近四年的issue ,這個issue請求實現 http.Server 的連接耗盡(draining)的功能。現在可以調用 srv.Close 可以立即停止 http.Server ,也可以調用 srv.Shutdown(ctx) 等待已有的連接處理完畢(耗盡,draining, github.com/tylerb/graceful 的用戶應該熟悉這個特性)。

下面這個例子中,服務器當收到 SIGINT 信號后( ^C )會優雅地關閉。

packagemain

import(
"context"
"io"
"log"
"net/http"
"os"
"os/signal"
"time"
)

funcmain() {

// subscribe to SIGINT signals
 stopChan := make(chanos.Signal)
 signal.Notify(stopChan, os.Interrupt)

 mux := http.NewServeMux()

 mux.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 time.Sleep(5* time.Second)
 io.WriteString(w, "Finished!")
 }))

 srv := &http.Server{Addr: ":8081", Handler: mux}

gofunc() {
// service connections
iferr := srv.ListenAndServe(); err !=nil{
 log.Printf("listen: %s\n", err)
 }
 }()

 <-stopChan // wait for SIGINT
 log.Println("Shutting down server")

// shut down gracefully, but wait no longer than 5 seconds before halting
 ctx, _ := context.WithTimeout(context.Background(),5*time.Second)
 srv.Shutdown(ctx)

 log.Println("Server gracefully stopped")

}

一旦收到 SIGINT 信號,服務器會立即停止接受新的連接, srv.ListenAndServe() 會返回http.ErrServerClosed 。 srv.Shutdown 會一直阻塞,直到所有未完成的request都被處理完以及它們底層的連接被關閉。

更復雜的處理可以通過 context 實現,例如使用 context.Timeout 實現最大的關閉等待時間。你可以嘗試復制 https://github.com/tylerchr/examples/tree/master/draining 中的例子并實現它。

通過 http.Pusher 實現 HTTP/2.0 server push

HTTP/2.0 包含 Server Push 特性, 允許 HTTP/2 服務器主動地發送額外的 HTTP response 給客戶端,即使客戶端沒有發送請求。目標是在客戶端無需請求的情況下,服務器可以及時地將客戶端所需的資源推送給客戶端。可以查看wiki HTTP/2 Server Push 看具體的例子。

如果一個服務器支持 HTTP/2 , 提供給 handler 的 http.ResponseWriter 會實現 http.Pusher 接口。Handler 可以使用這個功能區觸發Server Push, 虛擬的請求(synthetic request)可以被注冊的 http.Server Handler所處理。

下面的程序處理 /index.html , 可以push一個 /static/gopher.png :

packagemain

import"net/http"

funcmain() {

 http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("./static"))))

 http.Handle("/index.html", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

// server push is available if w implements http.Pusher
ifp, ok := w.(http.Pusher); ok {
 p.Push("/static/gopher.png",nil}
 }

// load the main page
 w.Header().Set("Content-Type","text/html")
 w.Write([]byte(`<img src="/static/gopher.png" />`))

 }))

 http.ListenAndServeTLS(":4430","cert.pem","key.pem",nil)

}

你可以從 https://github.com/tylerchr/examples/serverpush 克隆這個例子,下面是在 Chrome 54 訪問的結果:

明顯地可以在 Initiator 那一列中看到 gopher.png 被 Push ,你也可以看到標藍色的 gopher.png 先于 /index.html 被接收過來,這表明這個資源先于請求之前被推送到客戶端。HTML下載完后 <img> 可以顯示。

有人可能會問如何寫一個測試用來校驗實現 Server Push的 Handler。因為 http.NewTLSServer 沒有啟動 HTTP/2 服務器, httptest.ResponseRecorder 也沒有實現 http.Pusher 。我的解決方案是包裝 httptest.ResponseRecorder 實現 Pusher 接口,這里有個 例子 。

database/sql

database/sql 包有幾個主要的改變,可以讓用戶更好的控制數據庫查詢,允許用戶更好的利用數據庫的特性。

  • 查詢可以使用 context.Context 取消查詢
  • 純數據庫列類型可以通過 sql.ColumnType 得到
  • 如果底層數據庫支持,查詢可以使用命名參數

更多的細節可以閱讀Daniel Theophanes的文章 What is new in database/sql? ,他實現了大部分的改變。

plugin包實現動態插件

新增加的標準庫 plugin 提供了初步的插件支持,它允許程序可以在運行的時候動態的加載插件。

但是這個庫看起來還是bug多多,我甚至不能寫一個正常的程序來測試它,但是假定它的使用應該如下面的樣子:

// hexify.go
packagemain

import"encoding/hex"

funcHexify(instring)string{
returnhex.EncodeToString([]byte(in))
}

$ gobuild -buildmode=shared hexify.go
// produces hexify.so
// main.go
packagemain

import"plugin"

funcmain() {
 p, _ = plugin.Open("hexify.so")
 f := p.Lookup("Hexify")
 fmt.Println(f.(func(string)string)("gopher"))
// 676f70686572
}

    在這個例子中, hexify.go 實現了 Hexify 函數,它被編譯成一個共享庫,第二個程序動態加載它。這允許Go程序可以不在編譯的時候也能調用其它的庫。

別名

別名(aliasing)曾被增加到 Go 1.8 的語言規范中,但是現在又被移除了,看這個說明: this post from Russ Cox ,有可能會出現在 Go 1.9中。

這個特性也引起了很多的爭議,

指示符別名(Identifier aliasing)用來定義多個類型為同一個類型的語法。一個用處用來重構復雜的代碼的時候,允許重新劃分包而不必帶來類型的不一致。 Ian Lance Taylor舉了一個[例子](https://groups.google.com/d/msg/golang-dev/OmjsXkyOQpQ/OrcHWiGUBAAJ):

舉個具體的例子,將擴展包 golang.org/x/net/context 移動到標準庫 context 的過程。因為context已經被廣泛地使用,將所有的用戶的代碼統一轉換很困難,因此允許這兩個包通用很有必要。

別名的定義如下:

typeFoo => pkg.Bar 

這個語法定義 Foo 是 pkg.Bar 別名。 Foo 可以用在任何 pkg.Bar 出現的地方。以上個例子為例,任何需要類型 golang.org/x/net/context 的地方都可以用標準庫 context 代替,它們是等價的。

別名也可以用在常量、變量、函數等類型上。

這是一個很有爭議的特性,可以參考 issue 16339 和 golang-dev post 看大家的討論。因為它從Go 1.8中移除了,大家可以暫時不用關注這個特性了。

新的slice排序API

統一的slice排序由新的 sort.Slice 函數實現。它允許任意的slice都可以被排序,只需提供一個回調比較函數即可,而不是像以前要提供一個特定的 sort.Interface 的實現。這個函數沒有返回值。想其它的排序函數一樣,它提供了原地的排序。

下面的例子根據海拔高度排序知名山峰的slice。

typePeakstruct{
 Name string
 Elevation int// in feet
}

peaks := []Peak{
 {"Aconcagua",22838},
 {"Denali",20322},
 {"Kilimanjaro",19341},
 {"Mount Elbrus",18510},
 {"Mount Everest",29029},
 {"Mount Kosciuszko",7310},
 {"Mount Vinson",16050},
 {"Puncak Jaya",16024},
}

// does an in-place sort on the peaks slice, with tallest peak first
sort.Slice(peaks, func(i, jint)bool{
returnpeaks[i].Elevation >= peaks[j].Elevation
})

// peaks is now sorted

通過 sort.Interface 類型的 Len() 和 Swap(i, j int) 提供了抽象的排序類型,這是以前的排序方法,而 Less(i, j int) 作為一個比較回調函數,可以簡單地傳遞給 sort.Slice 進行排序。

其它

  • 87b1aaa encoding/base64 encoder現在有了嚴格模式.
  • 6ba5b32 expvar 暴露出來,可以用在其它的mux中.
  • 003a598 偽隨機碼可以通過 rand.Uint64() 產生 (先前僅支持uint32).
  • 67ea710 增加了一個新的 time.Until 函數,和 time.Since 對應.

net/http 故意只實現了使用TLS的HTTP/2,你可以查看[issue 14141] https://github.com/golang/go/issues/14141()了解細節。

sort.SliceStable 提供了穩定的slice排序,就像以前的 sort.Stable 一樣。

譯者增加的內容

Go 1.8 一個很大的特性就是性能的提升,包括二進制文件的大小、編譯速度和運行速度。

并且非常大的提升就是提供小于100us GC暫停。

net/http 提供了更多的超時設置,比如 ReadHeaderTimeout 、 IdleTimeout 。

一個完整的改動列表: Go 1.8


http://blog.csdn.net/andylau00j/article/details/53768777

Go語言已經7歲了!今年8月,Go 1.7如期發布。撰寫本稿時,Go 1.8的測試版也出來了。我們正在熱切盼望著明年2月的Go 1.8正式版。

如果你關注 TIOBE的編程語言排行榜 就會發現,截止到2016年11月,Go語言從原先的第50多位經過多次上竄已經躍到了第13位,躋入絕對主流的編程語言的行列!這份排行榜每月都會更新,并基于互聯網上的程序員老鳥、教學課程和相關廠商的數量進行排名。在國內,從我這幾年運營Go語言北京用戶組的經歷來看,可以明顯地感覺到Go語言的在國內的大熱。N多初創互聯網企業都選用Go語言作為他們的基礎技術棧。我還發現,已經有在大數據、機器人等尖端科技領域耕耘的國內公司開始使用Go語言。這門語言現在已經是無孔不入了。

1. 回顧

遙想去年的1.5版本,Go運行時系統和標準庫剛完成去C化,轉而完全由Go語言和匯編語言重寫。到現在,Go的源碼已有了較大的改進,Go語言版本的Go語言也更加成熟了。我下面就帶領大家一起回顧一下Go語言在2016年做出的那些大動作。

1.1 極速GC

當然,首先要說的還是性能。Go語言本身最大的性能提升依然在GC(garbage collection,垃圾回收)方面。從Go 1.5時標榜的GC耗時百毫秒級,到今天的全并發GC使得耗時達到毫秒級,再到即將發布的Go 1.8由于實施了諸多改進而達成的百微秒級以下的GC耗時,真可謂是突飛猛進! 

圖1 GC停頓時間——Go 1.5 vs. Go 1.6

圖2 GC停頓時間——Go 1.7

在經歷了如此變化之后,如果你現在再說你的Go程序的性能瓶頸在GC上,那只能讓人側目了。

當然,Go語言對自身性能的提升遠不止于此。

1.2 對HTTP/2的支持

很早以前,Go語言團隊就開始跟進HTTP/2草案了。從Go 1.6開始,我們其實已經可以間接地在Go程序中使用到HTTP/2了,應用場景如:使用Go程序開發基于HTTPS協議的服務端和客戶端。不過,這一切都是自動適配的,Go官方并未暴露出可以指定或配置HTTP/2模塊的任何API。另外,在還未發布的Go 1.8中,HTTP/2還會得到更廣泛的支持。

1.3 httptrace包

Go 1.7的標準庫中新增了net/http/httptrace代碼包(https://godoc.org/net/http/httptrace)。 它提供了一種調試HTTP請求和響應的方式。你可以像下面這樣輕易地獲取基于HTTP協議的通訊過程的詳細信息。

package main

import (
    "context"
    "fmt"
    "log"
    "net/http"
    "net/http/httptrace"
    "os"
)

func main() {
    traceCtx := httptrace.WithClientTrace(context.Background(), &httptrace.ClientTrace{
        GetConn: func(hostPort string) {
            fmt.Printf("Prepare to get a connection for %s.\n", hostPort)
        },
        GotConn: func(info httptrace.GotConnInfo) {
            fmt.Printf("Got a connection: reused: %v, from the idle pool: %v.\n",
                info.Reused, info.WasIdle)
        },
        PutIdleConn: func(err error) {
            if err == nil {
                fmt.Println("Put a connection to the idle pool: ok.")
            } else {
                fmt.Println("Put a connection to the idle pool:", err.Error())
            }
        },
        ConnectStart: func(network, addr string) {
            fmt.Printf("Dialing (%s:%s).\n", network, addr)
        },
        ConnectDone: func(network, addr string, err error) {
            if err == nil {
                fmt.Printf("Dial is done. (%s:%s)\n", network, addr)
            } else {
                fmt.Printf("Dial is done with error: %s. (%s:%s)\n", err, network, addr)
            }
        },
        WroteRequest: func(info httptrace.WroteRequestInfo) {
            if info.Err == nil {
                fmt.Println("Wrote a request: ok.")
            } else {
                fmt.Println("Wrote a request:", info.Err.Error())
            }
        },
        GotFirstResponseByte: func() {
            fmt.Println("Got the first response byte.")
        },
    })
    req, err := http.NewRequest("GET""http://www.golang.org/", nil)
    if err != nil {
        log.Fatal("Fatal error:", err)
    }
    req = req.WithContext(traceCtx)
    _, err = http.DefaultClient.Do(req)
    if err != nil {
        fmt.Fprintf(os.Stderr, "Request error: %v\n", err)
        os.Exit(1)
    }
}

1.4 子測試強烈建議你動手運行一下這個小程序,享受一下掌控全局的感覺。

Go 1.7中增加了對子測試(https://blog.golang.org/subtests) 的支持,包括功能測試和性能測試。子測試的主要目的是在測試函數中區分和展示因不同的測試參數或測試數據帶來的不同的測試結果。請看下面的測試程序。

package subtest

import (
    "fmt"
    "math/rand"
    "strconv"
    "testing"
)

// KE 代表鍵-元素對。
type KE struct {
    key     string
    element int
}

// BenchmarkMapPut 用于對字典的添加和修改操作進行測試。
func BenchmarkMapPut(b *testing.B) {
    max := 5
    var kes []KE
    for i := 0; i <= max; i++ {
        kes = append(kes, KE{strconv.Itoa(i), rand.Intn(1000000)})
    }
    m := make(map[string]int)
    b.ResetTimer()
    for _, ke := range kes {
        k, e := ke.key, ke.element
        b.Run(fmt.Sprintf("Key: %s, Element: %#v", k, e), func(b *testing.B) {
            for i := 0; i < b.N; i++ {
                m[k] = e + i
            }
        })
    }
}

ok _/Users/haolin/infoq-2016_review_go /demo/subtest 8.678s在程序所在目錄下使用go test -run=^$ -bench .命令運行它之后就會看到,針對每一個子測試,go test命令都會打印出一行測試摘要。它們是分離的、獨立統計的。這可以讓我們進行更加精細的測試,細到每次輸入輸出。上述打印內容類似: BenchmarkMapPut/Key:_0425,_Element:_498081-4 30000000 40.6 ns/op BenchmarkMapPut/Key:_1540,_Element:_727887-4 30000000 41.7 ns/op BenchmarkMapPut/Key:_2456,_Element:_131847-4 30000000 43.3 ns/op BenchmarkMapPut/Key:_3300,_Element:_984059-4 30000000 46.1 ns/op BenchmarkMapPut/Key:_4694,_Element:_902081-4 30000000 48.4 ns/op BenchmarkMapPut/Key:_5511,_Element:_941318-4 30000000 59.3 ns/op PASS

1.5 vendor目錄

在Go 1.5的時候,官方啟用了一個新的環境變量——GO15VENDOREXPERIMENT。該環境變量可以啟動Go的vendor目錄 (https://golang.org/s/go15vendor) 并用于存放當前代碼包依賴的代碼包。在Go 1.5中,若GO15VENDOREXPERIMENT的值為1則會啟動vendor目錄。Go 1.6正相反,默認支持vendor目錄,當GO15VENDOREXPERIMENT的值為0時禁用vendor目錄。到了Go 1.7,官方完全去掉了這個環境變量。這也代表著對vendor目錄的正式支持。Go語言的實驗特性一般都是按照類似的路數一步步邁向正式版的。

1.6 其他值得一提的改進

1.6.1 檢測并報告對字典的非并發安全訪問

從Go 1.6開始,Go運行時系統對字典的非并發安全訪問采取零容忍的態度。請看下面的程序。

package main

import "sync"

func main() {
    const workers = 100
    var wg sync.WaitGroup
    wg.Add(workers)
    m := map[int]int{}
    for i := 1; i <= workers; i++ {
        go func(i int) {
            for j := 0; j < i; j++ {
                m[i]++
            }
            wg.Done()
        }(i)
    }
    wg.Wait()
}

1.6.2 sort包的性能提升該程序在未施加任何保護的情況下在多個Goroutine中并發地訪問了字典實例m。我們知道,Go原生的字典類型是非并發安全的。所以上面這樣做很可能會讓m的值產生不可預期的變化。這在并發程序中應該堅決避免。在1.6之前,如此操作的Go程序并不會因此崩潰。但是在1.6,運行上述程序后就立刻會得到程序崩潰的結果。Go運行時系統只要檢測到類似代碼,就會強制結束程序并報告錯誤。

Go語言團隊一直致力于標準庫中眾多API的性能提升,并且效果向來顯著。我把sort包單拎出來強調是因為sort.Sort函數因性能優化而在行為上稍有調整。在Go 1.6,sort.Sort函數減少了大約10%的比較操作和交換操作的次數,從而獲得了20%~50%的性能提升。不過,這里有一個副作用,那就是sort.Sort函數的執行會使排序算法不穩定。所謂不穩定的排序算法,就是排序可能會使排序因子相等的多個元素在順序上不確定。比如,有如下需要根據長度排序的字符串的切片:

var langs= []string{"golang", "erlang", "java", "python", "php", "c++", "perl"}

經sort.Sort函數排序后,該切片只幾個長度相等的元素golang、erlang和Python的先后順序可能就不是這樣了,可能會變成erlang、golang、python。雖然它依然會依據排序因子(這里是字符串長度)進行完全正確的排序,但是如此確實可能對一些程序造成影響。

如果你需要穩定的排序,可以使用sort.Stable函數取而代之。

1.6.3 context包進入標準庫

在Go 1.7發布時,標準庫中已經出現了一個名為context的代碼包。該代碼包原先的導入路徑為golang.org/x/context,而后者現在已經不存在了。context包被正式引入標準庫,并且標準庫中的很多API都因此而做了改變。context.Context類型的值可以協調多個Groutine中的代碼執行“取消”操作,并且可以存儲鍵值對。最重要的是它是并發安全的。與它協作的API都可以由外部控制執行“取消”操作,比如:取消一個HTTP請求的執行。

1.6.4 go tool trace的增強

go tool trace自Go 1.5正式加入以來,成為了Go程序調試的又一利器。到了Go 1.7,它已經得到了大幅增強。比如,執行時間的縮短、跟蹤信息的豐富,等等。

1.6.5 unicode包現基于Unicode 9.0

Go 1.7升級了unicode包,使它支持Unicode 9.0標準。在這之前,它支持的Unicode 8.0標準。

1.6.6 新的編譯器后端——SSA

SSA 作為新的編譯器后端,可以讓編譯器生成壓縮比和執行效率都更高的代碼,并為今后的進一步優化提供了更有力的支持。在性能方面,它可以讓程序減少5%至35%的CPU使用時間。

到這里,我向大家展示了Go語言在2016年的一些顯著變化。由于篇幅原因,還有很多Go運行時系統和標準庫的改動沒能提及。尤其是性能方面的改進一直在持續,并潛移默化地為廣大Go程序員提供著底層紅利。

我強烈建議所有Go程序員緊跟Go語言團隊的腳步,升級版本,享受紅利。

2. 展望

2.1 新版本

關于展望,莫過于廣大Go程序員翹首期盼的Go 1.8了。這里提一下幾個如甘霖般的特性。

Go編寫的HTTP服務器支持平滑地關閉。這一功能早已由很多第三方代碼包實現,但是這次官方終于給出了答案。 支持HTTP/2的Server Push。這個就不多說了,肯定會比Hijack更好用。 新增了plugin包,你可以把一些Go程序作為插件動態地加載進你的程序了。 更廣泛的上下文支持,自從標準庫中有了context包,它就在很多地方起作用了。很多基于標準庫的接口功能都可以執行“取消”操作。在Go 1.8中,范圍將進一步擴大,比如:database/sql包和testing包都對上下文進行了支持。 sort包的功能改進,對于切片,我們不用再為了使用它的排序功能去編寫某個接口的實現類型。 go test命令有了新的標記:-mutexprofile。該標記用于提供關于鎖爭用的概要文件。 當然,最值得期待的仍然是Go在性能上的提升,尤其是GC方面,又要有一次飛躍了!另外,defer語句的執行會比之前快整整兩倍!cgo的調用開銷也降低了將近一半!

2.2技術社區

其實,除了對Go語言本身的展望,我們也應該憧憬Go社區(尤其是國內Go社區)的發展。中國現在已經差不多是Go程序員最多的國家了。如果打開Github上Go語言的Wiki(https://github.com/golang/go/wiki/GoUsers) 你就會發現,那里已經有一個非常長的列表了。其中的公司達到了近200家,相比于2015年年底翻了將近三倍。而且我相信這只是一小部分,只是在Github上有自己的官方組織且對社區有貢獻的一部分公司。不過,你可能還會發現,在China那一欄下的公司卻只有一家。這是為什么呢?比較值得深思。我想這也許能從側面反映出對國際技術社區(尤其是開源社區)有貢獻的國內公司太少的問題。在2016年12月初舉辦的一個大型開源技術盛典的講臺上,某開源公司CEO提到了程序員對開源社區應該不只索取更要奉獻,這樣才能更好地宣傳和推銷自己。同時,組織機構也不應該成為大家合作的瓶頸。但是,我想國內的實際情況卻恰恰相反。我們國內的計算機技術公司,甚至技術驅動的互聯網公司,大都沒有為開源社區做奉獻的習慣,甚至從規章制度上就是明令禁止的。從這方面看,我覺得那個列表中的China欄的慘狀也著實不冤。我熱切盼望到了明年這個China欄能夠變長很多。

不過,從Github以及國內一些代碼托管倉庫上的Go項目數量上看,國人編寫的Go軟件其實已經非常多了。近年來崛起的國內Go開源項目已有不少,特別是(按Star數排列)Gogs、Beego、TiDB、Codis、Pholcus、Hprose、Cyclone等等。他們都已經在國際或國內有了一定的影響力。另外,國人或華人參與的國際Go開源項目更是眾多,比如很多人熟知的容器技術領域翹楚Docker、Kubernates、Etcd,等等。

當然,除了一些拔尖的人和拔尖的項目。大多數中國Go程序員和愛好者還是只在國內活躍的。國內的很多地方都自行發起了Go語言用戶組,包括但不限于:北京、上海、深圳、杭州,大連、香港等。在各個地方舉辦的Go語言技術聚會也更加專業、更加頻繁,同時規模更大。僅在北京,2016年參加此類聚會或活動的人次就將近400,Go語言北京用戶組的微信公眾號(golang-beijing)的粉絲數也超過了2000。據悉,在2017年,各地的Go語言用戶組還會有更大的動作。

我個人認為,如今Go語言的國內推廣已經基本完成了科普階段,現在我們可以實行更加輕松的推波助瀾、順水推舟的推廣策略了。由于Go語言的優秀以及不斷的進化,現在自發地關注Go語言的人越來越多了,尤其是在高等學府和編程新手的人群中。

Go語言很好學,配套工具完善,開發和運行效率高,應用領域眾多,國內社區也很活躍,有各種各樣的中文資料和教程,進階并不難,其工程化理念也相當得民心。如果你不是一點時間都沒有的話,我建議你學一學這門簡約、高效的編程語言。在互聯網時代,尤其是是移動互聯網時代,它已經大有作為。即使對于炙手可熱的大數據、微服務等新型領域和理念而言,它也是一個相當重要的技術棧。甚至在即將爆發的人工智能和機器人大潮,我相信,Go語言也必會大放異彩!

作者介紹

郝林,Go語言北京用戶組的發起人,極客學院Go語言課程顧問,著有圖靈原創圖書《Go并發編程實戰》,同時也是在線免費教程《Go命令教程》和《Go語言第一課》的作者。目前在微賽時代任平臺技術負責人。

參考文獻

Go 1.6 Release Notes: https://tip.golang.org/doc/go1.6

Go 1.7 Release Notes: https://tip.golang.org/doc/go1.7

Go 1.8 Release Notes(Beta): https://tip.golang.org/doc/go1.8

The State of Go(2016): https://talks.golang.org/2016/state-of-go.slide

來自:http://www.infoq.com/cn/articles/2016-review-go

posted on 2017-01-20 15:28 思月行云 閱讀(1202) 評論(0)  編輯 收藏 引用 所屬分類: Golang
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            午夜久久久久| 亚洲国产福利在线| 日韩午夜在线播放| 欧美精品成人在线| 亚洲小视频在线| 亚洲一二三级电影| 狠狠色丁香久久婷婷综合丁香| 久久电影一区| 久久亚洲精品一区| 一区二区三区 在线观看视频| 99精品热视频| 国产手机视频一区二区| 美女视频黄a大片欧美| 欧美激情亚洲视频| 午夜一区二区三区不卡视频| 欧美中文字幕在线播放| 99国产精品久久久久久久久久| 亚洲欧美三级伦理| 一色屋精品视频在线观看网站| 亚洲国产另类久久久精品极度| 欧美色网在线| 久久婷婷成人综合色| 欧美美女喷水视频| 久久精品电影| 欧美日本簧片| 久久综合五月天婷婷伊人| 欧美日韩国产一区二区| 久久久精品久久久久| 欧美激情片在线观看| 久久爱www久久做| 欧美日韩国产a| 蜜桃久久精品乱码一区二区| 国产精品成人在线观看| 欧美二区视频| 国产日本欧美视频| 一本色道久久88综合日韩精品| 在线国产精品一区| 亚洲一区二区三区涩| av成人激情| 美日韩在线观看| 久久精品麻豆| 国产精品久久久久aaaa九色| 亚洲国产精品久久91精品| 国产亚洲欧美日韩一区二区| 一区二区激情视频| 日韩一级精品| 老司机免费视频一区二区| 久久精品99国产精品| 国产精品免费在线| 一本色道久久88综合亚洲精品ⅰ| 亚洲国产一区二区三区在线播| 欧美影视一区| 欧美一区亚洲| 国产精品亚洲综合色区韩国| 亚洲视频一起| 亚洲欧美国产77777| 欧美噜噜久久久xxx| 亚洲片区在线| 夜夜嗨av色综合久久久综合网| 狼狼综合久久久久综合网 | 国产精品a久久久久| 91久久精品国产91久久性色| 亚洲第一页自拍| 久久久久99精品国产片| 久久亚洲欧美国产精品乐播| 国产日韩欧美制服另类| 欧美亚洲一级| 久久影视精品| 亚洲黑丝在线| 欧美激情亚洲自拍| 99国内精品| 午夜精品在线视频| 国产人成一区二区三区影院| 久久不射2019中文字幕| 美女国内精品自产拍在线播放| 狠狠干成人综合网| 蜜桃久久精品一区二区| 亚洲精华国产欧美| 亚洲欧美成人一区二区三区| 国产性做久久久久久| 久久免费精品视频| 亚洲激情第一区| 国产精品日本一区二区| 最近中文字幕mv在线一区二区三区四区 | 欧美成人精品激情在线观看| 免播放器亚洲| 国产精品丝袜91| 亚洲欧美一区二区精品久久久| 136国产福利精品导航网址| 久久久人成影片一区二区三区观看| 毛片一区二区| 亚洲精品中文字幕有码专区| 欧美精品激情| 亚洲一区二区伦理| 久久久夜夜夜| 9国产精品视频| 国产丝袜一区二区| 免费在线成人| 亚洲欧美一区二区在线观看| 亚洲一区日韩在线| av成人激情| 国产日韩在线不卡| 欧美成人午夜影院| 午夜精品久久久99热福利| 免费观看成人鲁鲁鲁鲁鲁视频| 日韩一级片网址| 国产综合色在线视频区| 欧美精品在线看| 久久久久国产精品一区三寸| 9久草视频在线视频精品| 久久在线免费观看| 亚洲欧洲av一区二区三区久久| 亚洲成在线观看| 国产精品一区二区久激情瑜伽| 欧美高清在线| 久久成人久久爱| 亚洲一区二区三区成人在线视频精品 | 久久精品一级爱片| 亚洲日本乱码在线观看| 国内精品伊人久久久久av影院| 亚洲精品乱码久久久久久蜜桃91| 欧美伊人精品成人久久综合97| 亚洲经典三级| 国产综合自拍| 国产精品一区二区视频| 欧美另类一区| 欧美国产日韩一区| 久久最新视频| 久久久久久久久久看片| 性刺激综合网| 亚洲欧美日韩精品久久| 一区二区三区产品免费精品久久75 | 亚洲电影免费观看高清完整版在线观看| 亚洲精品视频一区| 在线免费高清一区二区三区| 国产婷婷色一区二区三区在线 | 欧美日韩视频不卡| 欧美国产日韩一区二区| 久久精品视频va| 欧美在线视频免费| 亚洲一区久久久| 亚洲欧美日韩一区二区| 亚洲在线不卡| 欧美一区二区成人| 久久成人羞羞网站| 久久久福利视频| 久久综合婷婷| 欧美 日韩 国产在线| 欧美激情1区2区3区| 欧美激情中文不卡| 亚洲人成网站影音先锋播放| 亚洲人妖在线| 一区二区三欧美| 亚洲婷婷综合久久一本伊一区| 亚洲无线观看| 久久er99精品| 久久这里只有精品视频首页| 欧美a级理论片| 欧美日韩免费| 国产欧美日韩另类一区| 国产综合久久| 亚洲精品美女在线观看| 亚洲视频一区在线观看| 先锋亚洲精品| 欧美电影在线观看| 亚洲乱码日产精品bd| 亚洲综合视频1区| 久久久久久久999精品视频| 欧美a级大片| 国产精品一级在线| 在线成人激情黄色| 亚洲线精品一区二区三区八戒| 久久精品99国产精品| 亚洲黄色一区| 香蕉av777xxx色综合一区| 麻豆精品精华液| 国产精品久久二区| 一区二区三区在线不卡| 亚洲免费观看高清在线观看| 性欧美在线看片a免费观看| 欧美激情中文字幕乱码免费| 亚洲欧美日韩直播| 欧美顶级大胆免费视频| 国产日韩欧美综合| 一本大道av伊人久久综合| 欧美永久精品| 亚洲精品色婷婷福利天堂| 久久国产直播| 国产精品视屏| 日韩一二三区视频| 美女啪啪无遮挡免费久久网站| 一区二区欧美日韩视频| 美女黄网久久| 狠狠色综合色综合网络| 亚洲私人黄色宅男| 欧美韩日亚洲| 久久精品首页| 国产视频一区在线观看一区免费| 日韩视频―中文字幕| 免费成年人欧美视频|