成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開(kāi)發(fā) 開(kāi)發(fā)工具 前端
BenchmarksGame的測(cè)試不同語(yǔ)言實(shí)現(xiàn)差別較大, 比如: Go的binary-trees開(kāi)了很多goroutine, C的程序開(kāi)了omp優(yōu)化等.Go1.1的更新主要涉及 語(yǔ)言/實(shí)現(xiàn)/性能優(yōu)化/標(biāo)準(zhǔn)庫(kù)幾個(gè)部分.

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

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

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

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

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

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

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

Go1.1的更新主要涉及 語(yǔ)言/實(shí)現(xiàn)/性能優(yōu)化/標(biāo)準(zhǔn)庫(kù)幾個(gè)部分.

補(bǔ)充: Go1.1的二進(jìn)制安裝包將包含gotour程序(啟動(dòng)命令: go tool tour).

一、語(yǔ)言的改變

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

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

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

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

在 Go1.1 中, 整數(shù)被一個(gè)常量0將會(huì)被當(dāng)作一個(gè)編譯錯(cuò)誤處理.

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

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

方法值和方法表達(dá)式

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

 

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

 

方法值(method values)不同于方法表達(dá)式(method expressions), 方法表達(dá)式是從一個(gè)類型對(duì)應(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)有的代碼不需要更新, 這個(gè)是新加的特性.

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)  

 

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

Return requirements

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

 

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

 

會(huì)有以下編譯錯(cuò)誤:

function ends without a return statement

之前一般可以在末尾加一個(gè)panic來(lái)回避這個(gè)問(wèn)題:

 

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

 

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

主要有以下幾種類型:

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

已有的代碼可以不用更新, 當(dāng)然有些代碼可以寫的更簡(jiǎn)化.

#p#

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

 

gccgo的變化

上個(gè)月發(fā)布的 GCC 4.8.0 還沒(méi)有完整的包含 Go1.1. 確實(shí)的主要功能是沒(méi)有方法值, 標(biāo)準(zhǔn)庫(kù)也有一些差異. 可以期望5月份發(fā)布GCC4.8.1時(shí), gccgo能夠完整支持Go1.1.

命令行參數(shù)解析

在目前的gc工具鏈中, 編譯器和連接器使用的是同樣的命令行參數(shù)解析規(guī)則, 基于Go語(yǔ)言的flag包實(shí)現(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

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

更新: 大部分代碼不受影響. 如果可能會(huì)影響涉及 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位平臺(tái)的堆大小

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

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

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

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

Unicode

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

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

比如:

 

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

 

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

Race detector

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

比如以下的代碼, 在2個(gè)不同goroutine中競(jìng)爭(zhēng)訪問(wèn)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.     }  

 

可以這樣測(cè)試:

 

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

 

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

gc assemblers

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

go 的變化

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

補(bǔ)充: 建議兲朝用戶手工下載, 因?yàn)?code>go get默認(rèn)使用的https協(xié)議經(jīng)常被墻.

go test 的變化

當(dāng)啟動(dòng)了剖析選項(xiàng)時(shí), go test默認(rèn)不在刪除二進(jìn)制測(cè)試程序. 有專門的選項(xiàng)-cpuprofile:

 

  1. $ go test -cpuprofile cpuprof.out mypackage 

 

還有-blockprofile選項(xiàng), 可以檢測(cè)goroutines被阻塞情況.

更多細(xì)節(jié)請(qǐng)參考: 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)建選項(xiàng):

 

  1. // +build go1.1  

 

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

 

  1. // +build !go1.1  

 

新支持的平臺(tái)

Go1.1工具鏈實(shí)驗(yàn)性的增加freebsd/arm, netbsd/386, netbsd/amd64, netbsd/arm, openbsd/386openbsd/amd64平臺(tái)的支持.

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

Go1.1對(duì)于linux/arm平臺(tái)實(shí)驗(yàn)性的提供cgo的支持.

交叉編譯

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

三、性能優(yōu)化

主要有以下幾個(gè)地方:

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

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

補(bǔ)充: Windows版本很多優(yōu)化的代碼還沒(méi)有合并進(jìn)來(lái), 特別是運(yùn)行時(shí)/網(wǎng)絡(luò)部分.

四、標(biāo)準(zhǔn)庫(kù)的變化

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

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

原文鏈接:http://my.oschina.net/chai2010/blog/117984

責(zé)任編輯:林師授 來(lái)源: chai2010的博客
相關(guān)推薦

2013-05-15 09:51:03

GoGo1.1性能測(cè)試

2025-04-14 00:00:00

2013-04-01 10:22:21

GoGo 1.1

2025-01-06 09:18:04

2013-05-22 09:38:03

GoGo語(yǔ)言Go性能

2013-05-15 09:27:58

2019-11-07 15:24:46

PythonGo語(yǔ)言編程語(yǔ)言

2013-07-11 09:29:24

J2EE7

2022-02-11 21:01:18

GoNetip網(wǎng)絡(luò)庫(kù)

2010-09-17 10:29:51

IntelAMD

2025-02-12 08:50:22

2025-01-20 08:51:32

2025-04-29 08:59:37

2021-09-05 18:25:30

Go命令倉(cāng)庫(kù)

2024-04-18 08:04:47

ElectronChrome升級(jí)

2022-04-24 15:55:22

Go語(yǔ)言語(yǔ)言函數(shù)

2021-04-30 19:53:41

Java表達(dá)式代碼

2012-03-14 12:29:55

JavaPlay Framwo

2024-01-22 00:30:00

Go編程Go 1.22

2021-07-15 23:18:48

Go語(yǔ)言并發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 精精国产xxxx视频在线 | 老牛嫩草一区二区三区av | 亚洲欧美综合 | 日韩精品一区在线 | 少妇精品亚洲一区二区成人 | 欧美男人天堂 | 国产精品大片在线观看 | 超碰最新在线 | 精品欧美一区二区三区久久久 | 欧美大片黄 | 黑人性hd | 亚洲精品第一页 | 亚洲一区 中文字幕 | 国产精品美女久久久久 | 国产黄色电影 | 久久尤物免费一区二区三区 | 亚洲国产免费 | 久久久久久www | 色吧久久 | 亚洲国产成人av好男人在线观看 | 在线播放国产一区二区三区 | 亚洲国产欧美一区 | 精品影院| av电影一区二区 | 亚洲啪啪 | 国产精品 欧美精品 | 精品视频一区二区三区在线观看 | 一级黄大片 | 亚洲国产精品一区二区第一页 | 欧美一区不卡 | 国产精品成人一区二区三区 | 中文字幕成人 | 国产精品视频在线播放 | 黄色在线免费网站 | 欧美中文字幕在线 | 成人免费一级视频 | 国产三级| 亚洲精品乱码久久久久久蜜桃91 | 日本三级电影免费观看 | 色综合久久天天综合网 | 在线观看欧美一区 |