• <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>
            Fork me on GitHub
            隨筆 - 215  文章 - 13  trackbacks - 0
            <2010年2月>
            31123456
            78910111213
            14151617181920
            21222324252627
            28123456
            78910111213


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

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            相冊

            Awesome

            Blog

            Book

            GitHub

            Link

            搜索

            •  

            積分與排名

            • 積分 - 216814
            • 排名 - 118

            最新評論

            閱讀排行榜

            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 新特性的開發(fā)工作已經(jīng)凍結(jié),Go 1.8 將在2017年2月左右發(fā)布,現(xiàn)在讓我們看一些在Go 1.8更有趣的API的改變。

            HTTP server connection draining

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

            下面這個(gè)例子中,服務(wù)器當(dāng)收到 SIGINT 信號后( ^C )會(huì)優(yōu)雅地關(guān)閉。

            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 信號,服務(wù)器會(huì)立即停止接受新的連接, srv.ListenAndServe() 會(huì)返回http.ErrServerClosed 。 srv.Shutdown 會(huì)一直阻塞,直到所有未完成的request都被處理完以及它們底層的連接被關(guān)閉。

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

            通過 http.Pusher 實(shí)現(xiàn) HTTP/2.0 server push

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

            如果一個(gè)服務(wù)器支持 HTTP/2 , 提供給 handler 的 http.ResponseWriter 會(huì)實(shí)現(xiàn) http.Pusher 接口。Handler 可以使用這個(gè)功能區(qū)觸發(fā)Server Push, 虛擬的請求(synthetic request)可以被注冊的 http.Server Handler所處理。

            下面的程序處理 /index.html , 可以push一個(gè) /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 克隆這個(gè)例子,下面是在 Chrome 54 訪問的結(jié)果:

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

            有人可能會(huì)問如何寫一個(gè)測試用來校驗(yàn)實(shí)現(xiàn) Server Push的 Handler。因?yàn)?nbsp;http.NewTLSServer 沒有啟動(dòng) HTTP/2 服務(wù)器, httptest.ResponseRecorder 也沒有實(shí)現(xiàn) http.Pusher 。我的解決方案是包裝 httptest.ResponseRecorder 實(shí)現(xiàn) Pusher 接口,這里有個(gè) 例子 。

            database/sql

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

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

            更多的細(xì)節(jié)可以閱讀Daniel Theophanes的文章 What is new in database/sql? ,他實(shí)現(xiàn)了大部分的改變。

            plugin包實(shí)現(xiàn)動(dòng)態(tài)插件

            新增加的標(biāo)準(zhǔn)庫 plugin 提供了初步的插件支持,它允許程序可以在運(yùn)行的時(shí)候動(dòng)態(tài)的加載插件。

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

            // 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
            }

                在這個(gè)例子中, hexify.go 實(shí)現(xiàn)了 Hexify 函數(shù),它被編譯成一個(gè)共享庫,第二個(gè)程序動(dòng)態(tài)加載它。這允許Go程序可以不在編譯的時(shí)候也能調(diào)用其它的庫。

            別名

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

            這個(gè)特性也引起了很多的爭議,

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

            舉個(gè)具體的例子,將擴(kuò)展包 golang.org/x/net/context 移動(dòng)到標(biāo)準(zhǔn)庫 context 的過程。因?yàn)閏ontext已經(jīng)被廣泛地使用,將所有的用戶的代碼統(tǒng)一轉(zhuǎn)換很困難,因此允許這兩個(gè)包通用很有必要。

            別名的定義如下:

            typeFoo => pkg.Bar 

            這個(gè)語法定義 Foo 是 pkg.Bar 別名。 Foo 可以用在任何 pkg.Bar 出現(xiàn)的地方。以上個(gè)例子為例,任何需要類型 golang.org/x/net/context 的地方都可以用標(biāo)準(zhǔn)庫 context 代替,它們是等價(jià)的。

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

            這是一個(gè)很有爭議的特性,可以參考 issue 16339 和 golang-dev post 看大家的討論。因?yàn)樗鼜腉o 1.8中移除了,大家可以暫時(shí)不用關(guān)注這個(gè)特性了。

            新的slice排序API

            統(tǒng)一的slice排序由新的 sort.Slice 函數(shù)實(shí)現(xiàn)。它允許任意的slice都可以被排序,只需提供一個(gè)回調(diào)比較函數(shù)即可,而不是像以前要提供一個(gè)特定的 sort.Interface 的實(shí)現(xiàn)。這個(gè)函數(shù)沒有返回值。想其它的排序函數(shù)一樣,它提供了原地的排序。

            下面的例子根據(jù)海拔高度排序知名山峰的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) 作為一個(gè)比較回調(diào)函數(shù),可以簡單地傳遞給 sort.Slice 進(jìn)行排序。

            其它

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

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

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

            譯者增加的內(nèi)容

            Go 1.8 一個(gè)很大的特性就是性能的提升,包括二進(jìn)制文件的大小、編譯速度和運(yùn)行速度。

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

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

            一個(gè)完整的改動(dòng)列表: Go 1.8


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

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

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

            1. 回顧

            遙想去年的1.5版本,Go運(yùn)行時(shí)系統(tǒng)和標(biāo)準(zhǔn)庫剛完成去C化,轉(zhuǎn)而完全由Go語言和匯編語言重寫。到現(xiàn)在,Go的源碼已有了較大的改進(jìn),Go語言版本的Go語言也更加成熟了。我下面就帶領(lǐng)大家一起回顧一下Go語言在2016年做出的那些大動(dòng)作。

            1.1 極速GC

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

            圖1 GC停頓時(shí)間——Go 1.5 vs. Go 1.6

            圖2 GC停頓時(shí)間——Go 1.7

            在經(jīng)歷了如此變化之后,如果你現(xiàn)在再說你的Go程序的性能瓶頸在GC上,那只能讓人側(cè)目了。

            當(dāng)然,Go語言對自身性能的提升遠(yuǎn)不止于此。

            1.2 對HTTP/2的支持

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

            1.3 httptrace包

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

            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 子測試強(qiáng)烈建議你動(dòng)手運(yùn)行一下這個(gè)小程序,享受一下掌控全局的感覺。

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

            package subtest

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

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

            // BenchmarkMapPut 用于對字典的添加和修改操作進(jìn)行測試。
            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 .命令運(yùn)行它之后就會(huì)看到,針對每一個(gè)子測試,go test命令都會(huì)打印出一行測試摘要。它們是分離的、獨(dú)立統(tǒng)計(jì)的。這可以讓我們進(jìn)行更加精細(xì)的測試,細(xì)到每次輸入輸出。上述打印內(nèi)容類似: 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的時(shí)候,官方啟用了一個(gè)新的環(huán)境變量——GO15VENDOREXPERIMENT。該環(huán)境變量可以啟動(dòng)Go的vendor目錄 (https://golang.org/s/go15vendor) 并用于存放當(dāng)前代碼包依賴的代碼包。在Go 1.5中,若GO15VENDOREXPERIMENT的值為1則會(huì)啟動(dòng)vendor目錄。Go 1.6正相反,默認(rèn)支持vendor目錄,當(dāng)GO15VENDOREXPERIMENT的值為0時(shí)禁用vendor目錄。到了Go 1.7,官方完全去掉了這個(gè)環(huán)境變量。這也代表著對vendor目錄的正式支持。Go語言的實(shí)驗(yàn)特性一般都是按照類似的路數(shù)一步步邁向正式版的。

            1.6 其他值得一提的改進(jìn)

            1.6.1 檢測并報(bào)告對字典的非并發(fā)安全訪問

            從Go 1.6開始,Go運(yùn)行時(shí)系統(tǒng)對字典的非并發(fā)安全訪問采取零容忍的態(tài)度。請看下面的程序。

            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包的性能提升該程序在未施加任何保護(hù)的情況下在多個(gè)Goroutine中并發(fā)地訪問了字典實(shí)例m。我們知道,Go原生的字典類型是非并發(fā)安全的。所以上面這樣做很可能會(huì)讓m的值產(chǎn)生不可預(yù)期的變化。這在并發(fā)程序中應(yīng)該堅(jiān)決避免。在1.6之前,如此操作的Go程序并不會(huì)因此崩潰。但是在1.6,運(yùn)行上述程序后就立刻會(huì)得到程序崩潰的結(jié)果。Go運(yùn)行時(shí)系統(tǒng)只要檢測到類似代碼,就會(huì)強(qiáng)制結(jié)束程序并報(bào)告錯(cuò)誤。

            Go語言團(tuán)隊(duì)一直致力于標(biāo)準(zhǔn)庫中眾多API的性能提升,并且效果向來顯著。我把sort包單拎出來強(qiáng)調(diào)是因?yàn)閟ort.Sort函數(shù)因性能優(yōu)化而在行為上稍有調(diào)整。在Go 1.6,sort.Sort函數(shù)減少了大約10%的比較操作和交換操作的次數(shù),從而獲得了20%~50%的性能提升。不過,這里有一個(gè)副作用,那就是sort.Sort函數(shù)的執(zhí)行會(huì)使排序算法不穩(wěn)定。所謂不穩(wěn)定的排序算法,就是排序可能會(huì)使排序因子相等的多個(gè)元素在順序上不確定。比如,有如下需要根據(jù)長度排序的字符串的切片:

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

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

            如果你需要穩(wěn)定的排序,可以使用sort.Stable函數(shù)取而代之。

            1.6.3 context包進(jìn)入標(biāo)準(zhǔn)庫

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

            1.6.4 go tool trace的增強(qiáng)

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

            1.6.5 unicode包現(xiàn)基于Unicode 9.0

            Go 1.7升級了unicode包,使它支持Unicode 9.0標(biāo)準(zhǔn)。在這之前,它支持的Unicode 8.0標(biāo)準(zhǔn)。

            1.6.6 新的編譯器后端——SSA

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

            到這里,我向大家展示了Go語言在2016年的一些顯著變化。由于篇幅原因,還有很多Go運(yùn)行時(shí)系統(tǒng)和標(biāo)準(zhǔn)庫的改動(dòng)沒能提及。尤其是性能方面的改進(jìn)一直在持續(xù),并潛移默化地為廣大Go程序員提供著底層紅利。

            我強(qiáng)烈建議所有Go程序員緊跟Go語言團(tuán)隊(duì)的腳步,升級版本,享受紅利。

            2. 展望

            2.1 新版本

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

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

            2.2技術(shù)社區(qū)

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

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

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

            我個(gè)人認(rèn)為,如今Go語言的國內(nèi)推廣已經(jīng)基本完成了科普階段,現(xiàn)在我們可以實(shí)行更加輕松的推波助瀾、順?biāo)浦鄣耐茝V策略了。由于Go語言的優(yōu)秀以及不斷的進(jìn)化,現(xiàn)在自發(fā)地關(guān)注Go語言的人越來越多了,尤其是在高等學(xué)府和編程新手的人群中。

            Go語言很好學(xué),配套工具完善,開發(fā)和運(yùn)行效率高,應(yīng)用領(lǐng)域眾多,國內(nèi)社區(qū)也很活躍,有各種各樣的中文資料和教程,進(jìn)階并不難,其工程化理念也相當(dāng)?shù)妹裥摹H绻悴皇且稽c(diǎn)時(shí)間都沒有的話,我建議你學(xué)一學(xué)這門簡約、高效的編程語言。在互聯(lián)網(wǎng)時(shí)代,尤其是是移動(dòng)互聯(lián)網(wǎng)時(shí)代,它已經(jīng)大有作為。即使對于炙手可熱的大數(shù)據(jù)、微服務(wù)等新型領(lǐng)域和理念而言,它也是一個(gè)相當(dāng)重要的技術(shù)棧。甚至在即將爆發(fā)的人工智能和機(jī)器人大潮,我相信,Go語言也必會(huì)大放異彩!

            作者介紹

            郝林,Go語言北京用戶組的發(fā)起人,極客學(xué)院Go語言課程顧問,著有圖靈原創(chuàng)圖書《Go并發(fā)編程實(shí)戰(zhàn)》,同時(shí)也是在線免費(fèi)教程《Go命令教程》和《Go語言第一課》的作者。目前在微賽時(shí)代任平臺(tái)技術(shù)負(fù)責(zé)人。

            參考文獻(xiàn)

            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 思月行云 閱讀(1196) 評論(0)  編輯 收藏 引用 所屬分類: Golang
            国内精品久久久久影院日本| 久久久久亚洲AV无码观看| 国产精品无码久久久久久| 国内精品久久国产大陆| 99久久综合国产精品二区| 久久嫩草影院免费看夜色| 久久精品国产乱子伦| 久久亚洲综合色一区二区三区| 久久精品18| 精品国产乱码久久久久久郑州公司| 97久久综合精品久久久综合| 久久婷婷五月综合97色直播| 久久w5ww成w人免费| 色婷婷综合久久久久中文字幕| 国产综合久久久久| 无码精品久久一区二区三区| a级成人毛片久久| 亚洲伊人久久大香线蕉综合图片 | 久久亚洲精品中文字幕| 一本大道加勒比久久综合| 亚洲中文精品久久久久久不卡| 欧美久久一级内射wwwwww.| 国产精品久久国产精品99盘| 伊人久久久AV老熟妇色| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 久久久久人妻精品一区二区三区 | 久久精品国产亚洲网站| 国内高清久久久久久| 人妻无码精品久久亚瑟影视| 夜夜亚洲天天久久| 国产国产成人精品久久| 久久永久免费人妻精品下载| 伊人久久大香线蕉综合Av| 思思久久精品在热线热| 国产日韩欧美久久| 国产精品99久久久久久董美香| 99精品久久精品| 天天综合久久久网| 国产精品美女久久久久AV福利| 久久久久中文字幕| 亚洲狠狠久久综合一区77777|