歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Go1.1新特性介紹(語言和庫更完善/性能提高約30%)

Go1.1新特性介紹(語言和庫更完善/性能提高約30%)

日期:2017/3/1 9:57:18   编辑:Linux編程

目錄:

  • 語言的改變
  • 整數除以零是編譯錯誤
  • Unicode代理區碼點不能用於面值
  • 方法值和方法表達式
  • Return requirements
  • 實現和工具的變化
  • gccgo的變化
  • 命令行參數解析
  • 64位系統 int 大小為int64
  • 64位平台的堆大小
  • Unicode
  • Race detector
  • gc assemblers
  • go 的變化
  • go test 的變化
  • go fix 的變化
  • 新的構建約束
  • 新支持的平台
  • 交叉編譯
  • 性能優化
  • 標准庫的變化

前幾天GCC4.8發布, 已經部分包含Go1.1特性, 詳細介紹:

  • http://gcc.gnu.org/gcc-4.8/changes.html#go

根據golang-nuts的消息, 4月第1周可能會進入Go1.1發布流程(就是下周). 要修復的問題還剩20多一點的, 估計應該不會出現大的延期.

  • http://swtch.com/~rsc/go11.html

補充: Go1.1正式版本已經於2013.05.14正式發布.

補充: 目前還標記為Go1.1的剩余BUG主要是gccgo相關的, gccgo1.1的發布流程和GCC4.8.1同步.

Go1.1主要的目標是性能的優化和一些bug的修復, 詳細內容參考:

  • https://go.googlecode.com/hg/doc/go1.1.html
  • http://tip.golang.org/doc/go1.1

關於Go的性能測試數據(性能和C語言gcc -O2性能基本沒有差異):

  • Go自帶的測試程序結果
  • BenchmarksGame的測試結果

補充: BenchmarksGame的測試不同語言實現差別較大, 比如: Go的binary-trees開了很多goroutine, C的程序開了omp優化等.

Go1.1的更新主要涉及 語言/實現/性能優化/標准庫 幾個部分.

補充: Go1.1的二進制安裝包將包含gotour程序(啟動命令: go tool tour).

語言的改變

Go1發布時曾作出承諾, 保證在Go1.x發布後不會修改之前的語言特性. 這裡有一些問題的修復, 還有一些新增加的特性.

整數除以零是編譯錯誤

在Go1中, 整數被一個常量0除會導致一個運行時 panic:

func f(x int) int {
    return x/0
}

在 Go1.1 中, 整數被一個常量0將會被當作一個編譯錯誤處理.

Unicode代理區碼點不能用於面值

字符串和 rune 字面值的定義更加嚴格. Unicode代理區碼點不能用於面值. 細節請參考後面的 Unicode 章節.

方法值和方法表達式

Go1.1新實現了方法值(method values), 它是綁定到receiver值的一個閉包. 比如有一個實現了Writerw 值, 那麼 w.Write 將等價於下面的閉包函數:

func (p []byte) (n int, err error) {
    return w.Write(p)
}

方法值(method values)不同於方法表達式(method expressions), 方法表達式是從一個類型對應的函數. 比如 (*bufio.Writer).Write 和下面的普通函數類型:

func (w *bufio.Writer, p []byte) (n int, err error) {
    return w.Write(p)
}

更新: 現有的代碼不需要更新, 這個是新加的特性.

GoSpec中給出了很多例子:

f := t.Mv; f(7)   // like t.Mv(7)
f := pt.Mp; f(7)  // like pt.Mp(7)
f := pt.Mv; f(7)  // like (*pt).Mv(7)
f := t.Mp; f(7)   // like (&t).Mp(7)
f := makeT().Mp   // invalid: result of makeT() is not addressable

有了方法值, Go1.1可以從interface值中取出方法值(Go1.0不支持方法值):

var i interface { M(int) } = myVal
f := i.M; f(7)  // like i.M(7)

這樣改動的好處是類型的方法和interface方法完全統一了.

Return requirements

在Go1.1之前, 函數如果有返回值的話, 則最後必須有一個retune或panic語句.

func abs(x int) int {
    if x >= 0 {
        return x
    } else {
        return -x
    }
}

會有以下編譯錯誤:

function ends without a return statement

之前一般可以在末尾加一個panic來回避這個問題:

func abs(x int) int {
    if x >= 0 {
        return x
    } else {
        return -x
    }
    panic("not reachable")
}

在Go1.1規范, 對函數的終結語句做了定義:

  • https://go.googlecode.com/hg/doc/gospec.html#Terminatingstatements

主要有以下幾種類型:

  • return或者goto語句
  • 調用內置的panic函數
  • if語句: 必須帶else, 並且if和else部分都有明確的終結語句
  • for語句: 死循環的類型(無退出條件和break語句)
  • switch語句: 沒有break語句, 必須有default分支, 每個分支都有終結語句(或者是fallthrough到下個分支的終結語句)
  • select語句: 無break語句, 必須有default分支, 每個分支都有終結語句
  • 用於goto的Label

已有的代碼可以不用更新, 當然有些代碼可以寫的更簡化.

Copyright © Linux教程網 All Rights Reserved