日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Go1.1新特性介紹(語言和庫更完善/性能提高約30%)

前幾天GCC4.8發(fā)布, 已經(jīng)部分包含Go1.1特性, 詳細介紹:

成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),舒蘭企業(yè)網(wǎng)站建設(shè),舒蘭品牌網(wǎng)站建設(shè),網(wǎng)站定制,舒蘭網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,舒蘭網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

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

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

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

補充:Go1.1正式版本已經(jīng)于2013.05.14正式發(fā)布.

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

Go1.1主要的目標是性能的優(yōu)化和一些bug的修復(fù), 詳細內(nèi)容參考:

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

關(guān)于Go的性能測試數(shù)據(jù)(性能和C語言gcc -O2性能基本沒有差異):

  • Go自帶的測試程序結(jié)果
  • BenchmarksGame的測試結(jié)果

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

Go1.1的更新主要涉及語言/實現(xiàn)/性能優(yōu)化/標準庫幾個部分.

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

一、語言的改變

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

整數(shù)除以零是編譯錯誤

在Go1中, 整數(shù)被一個常量0除會導(dǎo)致一個運行時 panic:

 
 
 
  1. func f(x int) int {
  2.     return x/0
  3. }

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

Unicode代理區(qū)碼點不能用于面值

字符串和 rune 字面值的定義更加嚴格. Unicode代理區(qū)碼點不能用于面值. 細節(jié)請參考后面的 Unicode 章節(jié).

方法值和方法表達式

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

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

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

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

更新: 現(xiàn)有的代碼不需要更新, 這個是新加的特性.

GoSpec中給出了很多例子:

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

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

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

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

Return requirements

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

 
 
 
  1. func abs(x int) int {
  2.     if x >= 0 {
  3.         return x
  4.     } else {
  5.         return -x
  6.     }
  7. }

會有以下編譯錯誤:

function ends without a return statement

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

 
 
 
  1. func abs(x int) int {
  2.     if x >= 0 {
  3.         return x
  4.     } else {
  5.         return -x
  6.     }
  7.     panic("not reachable")
  8. }

在Go1.1規(guī)范, 對函數(shù)的終結(jié)語句做了定義:

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

主要有以下幾種類型:

  • return或者goto語句
  • 調(diào)用內(nèi)置的panic函數(shù)
  • if語句: 必須帶else, 并且if和else部分都有明確的終結(jié)語句
  • for語句: 死循環(huán)的類型(無退出條件和break語句)
  • switch語句: 沒有break語句, 必須有default分支, 每個分支都有終結(jié)語句(或者是fallthrough到下個分支的終結(jié)語句)
  • select語句: 無break語句, 必須有default分支, 每個分支都有終結(jié)語句
  • 用于goto的Label

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

#p#

二、實現(xiàn)和工具的變化

gccgo的變化

上個月發(fā)布的 GCC 4.8.0 還沒有完整的包含 Go1.1. 確實的主要功能是沒有方法值, 標準庫也有一些差異. 可以期望5月份發(fā)布GCC4.8.1時, gccgo能夠完整支持Go1.1.

命令行參數(shù)解析

在目前的gc工具鏈中, 編譯器和連接器使用的是同樣的命令行參數(shù)解析規(guī)則, 基于Go語言的flag包實現(xiàn). 和傳統(tǒng)的UNIX命令行習(xí)慣有些不同. 這可能影響直接調(diào)用GC工具的腳本. 例如, 原有的 go tool 6c -Fw -Dfoo 命令, 現(xiàn)在要這樣寫 go tool 6c -F -w -D foo.

64位系統(tǒng) int 大小為int64

語言規(guī)范運行實現(xiàn)自由選擇 intuint 為32位或64位. 在之前的實現(xiàn)中, intuint都是32位. 現(xiàn)在, 在 AMD64/x86-64 平臺, GC和gccgo實現(xiàn)的intuint 都是64位的. 一個相關(guān)的變化是, 在64位系統(tǒng)切片將可以分配超出int32能表示的20多億個元素.

更新: 大部分代碼不受影響. 如果可能會影響涉及 int 類型轉(zhuǎn)換有關(guān)的代碼:

 
 
 
  1. x := ^uint32(0) // x is 0xffffffff
  2. i := int(x)     // i is -1 on 32-bit systems, 0xffffffff on 64-bit
  3. fmt.Println(i)

下面是一種可移植的寫法(-1在所有系統(tǒng)是可以確定的):

 
 
 
  1. i := int(int32(x))

64位平臺的堆大小

對于64位平臺, 堆的最大上限擴大很大, 從幾個GB到幾十個GB(具體細節(jié)取決于系統(tǒng),并且可能會更改).

在32位系統(tǒng), 堆的大小沒有變化.

更新: 現(xiàn)有代碼沒有影響. 當時新程序可以使用更多的內(nèi)存.

補充:Windows/amd64目前默認為32GB(以后會根據(jù)不同版本調(diào)整).

Unicode

主要是和UTF16相關(guān)的代理區(qū)碼點有關(guān):

  • 代理區(qū)碼點不能用在字符/字符串面值中.
  • 代理區(qū)碼點的輸出也有變化

比如:

 
 
 
  1. import "fmt"
  2. func main() {
  3.     fmt.Printf("%+q\n", string(0xD800))
  4. }

Go 1.0輸出為 "\ud800", Go 1.1 輸出為 "\ufffd".

Race detector

go tool內(nèi)置數(shù)據(jù)競爭檢測工具. 目前只支持64位系統(tǒng). 使用時需要指定-race選項.

比如以下的代碼, 在2個不同goroutine中競爭訪問m.

 
 
 
  1. func main() {
  2.     c := make(chan bool)
  3.     m := make(map[string]string)
  4.     go func() {
  5.         m["1"] = "a" // First conflicting access.
  6.         c <- true
  7.     }()
  8.     m["2"] = "b" // Second conflicting access.
  9.     <-c
  10.     for k, v := range m {
  11.         fmt.Println(k, v)
  12.     }
  13. }

可以這樣測試:

 
 
 
  1. $ go run -race mysrc.go  // to run the source file

補充:檢測工具目前是基于LLVM的ThreadSanitizer race detector實現(xiàn)的.

gc assemblers

主要是為了適應(yīng)64位系統(tǒng)int的默認大小變化, 和其他一些內(nèi)部約定的變化.

go 的變化

go get時必須設(shè)置GOPATH, 并且GOPATHGOROOT不能相同.

補充:建議兲朝用戶手工下載, 因為go get默認使用的https協(xié)議經(jīng)常被墻.

go test 的變化

當啟動了剖析選項時, go test默認不在刪除二進制測試程序. 有專門的選項-cpuprofile:

 
 
 
  1. $ go test -cpuprofile cpuprof.out mypackage

還有-blockprofile選項, 可以檢測goroutines被阻塞情況.

更多細節(jié)請參考: go help test

go fix 的變化

現(xiàn)在go fix將不再支持Go1之前的代碼到Go1的轉(zhuǎn)換. 如果需要處理Go1之前的代碼, 需要先使用Go1的工具做預(yù)處理.

新的構(gòu)建約束

如果只在Go1.1+環(huán)境編譯, 可以設(shè)置以下構(gòu)建選項:

 
 
 
  1. // +build go1.1

如果是Go1.0.x的變化條件, 則是:

 
 
 
  1. // +build !go1.1

新支持的平臺

Go1.1工具鏈實驗性的增加freebsd/arm, netbsd/386, netbsd/amd64, netbsd/arm, openbsd/386openbsd/amd64平臺的支持.

對于 freebsd/armnetbsd/arm 必須是ARMv6或更高的版本.

Go1.1對于linux/arm平臺實驗性的提供cgo的支持.

交叉編譯

交叉編譯時, 默認禁止CGO. 如果需要啟動CGO, 需要手工設(shè)置CGO_ENABLED=1.

三、性能優(yōu)化

主要有以下幾個地方:

  • gc編譯器生成代碼優(yōu)化, 特別是Intel 32-bit下的浮點運算
  • gc編譯器采用更多的內(nèi)聯(lián)優(yōu)化, 比如內(nèi)置的append函數(shù)和interface的轉(zhuǎn)換等
  • map的一個改進實現(xiàn), 顯著減少內(nèi)存碎片和CPU時間
  • 在多核的CPU上, 可以并行的運行垃圾回收
  • 更精確的垃圾回收, 可以顯著減少堆的大小, 特別是在32位系統(tǒng)
  • 運行時和網(wǎng)絡(luò)庫配合更緊密, 減少上下文切換代價
  • 標準庫的優(yōu)化

根據(jù)官方的說法, Go1.1性能提升基本有30%-40%, 有時更多(當然也有不明顯的情況).

補充:Windows版本很多優(yōu)化的代碼還沒有合并進來, 特別是運行時/網(wǎng)絡(luò)部分.

四、標準庫的變化

  • reflect包功能完善: 實現(xiàn)了select的支持; 類型轉(zhuǎn)換支持; 變量到閉包的轉(zhuǎn)換; chan/map/slice的支持等.
  • 新加的包: go/format/net/http/cookiejar/runtime/race
  • 其他很多包的問題修復(fù)/功能完善/性能優(yōu)化 等.

這個部分細節(jié)太多, 具體查看官方文檔吧.


分享標題:Go1.1新特性介紹(語言和庫更完善/性能提高約30%)
文章位置:http://m.5511xx.com/article/djiopic.html