聊聊golang1.8的release note

昨晚清理了自己的pocket拆融,發(fā)現(xiàn)有好多收藏的文章都沒有時間讀蠢琳,挑了挑,選了golang1.8的release notesross cox的新年計劃讀了一下镜豹。寫下這篇水文以作記錄傲须。

安裝go1.8

建議使用gvm安裝,可以管理多個版本的golang逛艰。

No breaking changes

golang信守承諾躏碳,不管你是從1.0開始的老用戶還是1.7開始的新朋友,放心散怖,你們的代碼還能用菇绵。(swift程序員哭暈在廁所)

語言層面的修改

作為一門強類型語言中的強類型語言,一個連int和int64都不能隱式類型轉(zhuǎn)換的語言镇眷,golang1.8偷偷做出了一些讓步咬最。golang1.8中,如果兩個結(jié)構(gòu)體的field名稱和類型完全一樣欠动,只是tag不一樣的話永乌,它們之間可以相互convert了。當(dāng)然具伍,是顯式的翅雏。

func example() {
    type T1 struct {
        X int `json:"foo"`
    }
    type T2 struct {
        X int `json:"bar"`
    }
    var v1 T1
    var v2 T2
    v1 = T1(v2) // now legal
}

工具鏈

  1. 會有一個默認(rèn)的GOPATH了,默認(rèn)為$HOME/go
  2. go get在-insecure這個flag存在時也會走代理了(論走代理的重要性)
  3. 多了個go bug命令人芽,用于在github上報bug望几,并自動填好系統(tǒng)信息啥的。
  4. go doc命令產(chǎn)生的doc會更加有可讀性
  5. 增加了一個plugin package,不過目前只能用于linux,據(jù)說是用于動態(tài)增加插件的萤厅,還沒有試用過

運行時與性能

優(yōu)化了gc機制橄抹。
優(yōu)化了對并發(fā)時防止多個goroutine同時讀寫一個Map的檢查靴迫。
gc pauses明顯縮短,(usually under 100 microseconds and often as low as 10 microseconds. )
編譯速度據(jù)說快了20%到30%

標(biāo)準(zhǔn)庫

上面這些release note告訴我們go1.8比1.7好楼誓,但是對于寫代碼的我們來說玉锌,好像也沒有什么感覺,反倒是標(biāo)準(zhǔn)庫的變化疟羹,對我們的影響會比較大主守。

sort

從前的排序是這么寫的

type People struct {
  Name string
  Age int
}

type Peoples []People

func (peoples Peoples) Len() int {
  return len(peoples)
}
// Swap for sort
func (peoples Peoples) Swap(i,j int){
  peoples[i], peoples[j] = peoples[j], peoples[i]
}
// Less for sort
func (peoples Peoples) Less(i,j int) bool{
  return peoples[i].Age < peoples[j].Age
}
func main() {
  people := Peoples{
    {"Gopher", 7},
    {"Alice", 55},
    {"Vera", 24},
    {"Bob", 75},
  }
  sort.Sort(people)
  fmt.Println(people)
}

現(xiàn)在,sort包里面有了一個Slice函數(shù)阁猜,你以后可以這樣寫了丸逸。

// 按名字排序
sort.Slice(people, func(i, j int) bool { return people[i].Name < people[j].Name })
// 按年齡排序
sort.Slice(people, func(i, j int) bool { return people[i].Age < people[j].Age })

HTTP/2 push

不了解push技術(shù)的同學(xué)可以看看wiki
注意,push技術(shù)不是用來從服務(wù)端發(fā)送消息通知到前端的(那是websocket干的)剃袍。push一般是將原本需要前端發(fā)送一個請求來獲取的資源(腳本,css文件捎谨,字體文件民效,圖片等等)改成由服務(wù)端主動發(fā)送。push帶來的好處也很明顯(減少請求涛救,可以指定push順序等等)
下面我們來試用一下go1.8里面的push畏邢。
創(chuàng)建項目http2push,并創(chuàng)建文件main.go

package main

import (
  "fmt"
  "log"
  "net/http"
)

const mainJS = `console.log("hello world");`

const indexHTML = `<html>
<head>
    <title>Hello</title>
    <script src="/main.js"></script>
</head>
<body>
</body>
</html>
`

func main() {
  http.HandleFunc("/main.js", func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, mainJS)
  })
  http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    if r.URL.Path != "/" {
      http.NotFound(w, r)
      return
    }
    pusher, ok := w.(http.Pusher)
    if ok { // Push is supported. Try pushing rather than waiting for the browser.
      if err := pusher.Push("/main.js", nil); err != nil {
        log.Printf("Failed to push: %v", err)
      }
    }
    fmt.Fprintf(w, indexHTML)
  })
  log.Fatal(http.ListenAndServeTLS(":8080", "cert.pem", "key.pem", nil))
}

打開命令行,進入項目目錄检吆,首先運行

go run $GOROOT/src/crypto/tls/generate_cert.go --host 127.0.0.1

運行結(jié)果生成cert.pem和key.pem舒萎,然后運行

go run main.go

打開chrome,輸入

https://localhost:8080/

打開開發(fā)者工具,可以看到main.js是被服務(wù)端主動push過來的蹭沛,而不是瀏覽器主動發(fā)送的get請求臂寝。

支持http server graceful shutdown

調(diào)用server.Close()的話服務(wù)器會直接關(guān)閉,而調(diào)用server.Shutdown()的話服務(wù)器會處理完畢所有已有的連接然后再關(guān)閉摊灭。

期待

ross cox的目標(biāo)
Russ Cox說2017年要搞golang的包管理咆贬,
"In particular, other language ecosystems have really raised the bar for what people expect from package management, and the open source world has mostly agreed on semantic versioning, which provides a useful base for inferring version compatibility. "
不禁眼眶一濕。

比期待更期待

泛型泛型泛型帚呼。掏缎。。泛型有了煤杀,map,reduce啥的還會遠(yuǎn)嗎眷蜈。ross大神說:
"Nothing sparks more heated arguments among Go and non-Go developers than the question of whether Go should have support for generics (or how many years ago that should have happened). I don’t believe the Go team has ever said “Go does not need generics.” What we have said is that there are higher-priority issues facing Go. For example, I believe that better support for package management would have a much larger immediate positive impact on most Go developers than adding generics. But we do certainly understand that for a certain subset of Go use cases, the lack of parametric polymorphism is a significant hindrance."

大神最后給我們灌了一大碗雞湯,并表示沈自,他覺得雖然golang的泛型在2017年不會發(fā)生酌儒,但是他不會停止探索在golang上設(shè)計泛型。

"When I first started thinking about generics for Go in 2008, the main examples to learn from were C#, Java, Haskell, and ML. None of the approaches in those languages seemed like a perfect fit for Go. Today, there are newer attempts to learn from as well, including Dart, Midori, Rust, and Swift.

It’s been a few years since we ventured out and explored the design space. It is probably time to look around again, especially in light of the insight about mutability and the additional examples set by newer languages. I don’t think generics will happen this year, but I’d like to be able to say I understand the solution space better."

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酥泛,一起剝皮案震驚了整個濱河市今豆,隨后出現(xiàn)的幾起案子嫌拣,更是在濱河造成了極大的恐慌,老刑警劉巖呆躲,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件异逐,死亡現(xiàn)場離奇詭異,居然都是意外死亡插掂,警方通過查閱死者的電腦和手機灰瞻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辅甥,“玉大人酝润,你說我怎么就攤上這事×” “怎么了要销?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長夏块。 經(jīng)常有香客問我疏咐,道長,這世上最難降的妖魔是什么脐供? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任浑塞,我火速辦了婚禮,結(jié)果婚禮上政己,老公的妹妹穿的比我還像新娘酌壕。我一直安慰自己,他們只是感情好歇由,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布卵牍。 她就那樣靜靜地躺著,像睡著了一般印蓖。 火紅的嫁衣襯著肌膚如雪辽慕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天赦肃,我揣著相機與錄音溅蛉,去河邊找鬼。 笑死他宛,一個胖子當(dāng)著我的面吹牛船侧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播厅各,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼镜撩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了队塘?” 一聲冷哼從身側(cè)響起袁梗,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤宜鸯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后遮怜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淋袖,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年锯梁,在試婚紗的時候發(fā)現(xiàn)自己被綠了即碗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡陌凳,死狀恐怖剥懒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情合敦,我是刑警寧澤初橘,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站蛤肌,受9級特大地震影響壁却,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜裸准,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赔硫。 院中可真熱鬧炒俱,春花似錦、人聲如沸爪膊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽推盛。三九已至峦阁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耘成,已是汗流浹背榔昔。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瘪菌,地道東北人撒会。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像师妙,于是被迫代替她去往敵國和親诵肛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容