Golang 1.10 前瞻

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

Golang 1.10 beta 今天正式 release 了,Golang 1.10 正式發布將在 2018 年 2 月份,我們不妨先來看一下 1.10 的特性。大家可以從這個連結 go1.10 beta 進行下載安裝。驗證輸出如下就是安裝成功了。

➜  ~ go versiongo version go1.10beta1 darwin/amd64

如果你現在機器上已經安裝了其他版本,可以通過下面方式來體驗。

$ go get golang.org/x/build/version/go1.10beta1$ go1.10beta1 download

使用的時候用 go1.10beta1 替換之前的 go 命令即可。我們下面看一下 Go 1.10 的主要特性。

1. 相容性

語言本身依然向前相容,作業系統和上一個版本也沒有區別。值得注意的是 Go 1.10 將是最後一個可以運行在 OS X 10.8 的版本,Go 1.11 要求 OS 系統為 10.9 以及更新的系統。其他動作系統要求在 Go 1.11 也有調整。

2. 工具鏈

1. Build & Install

現在 build 的時候基於最新的源碼來進行編譯。

2. Test

Test 會將結果進行緩衝。我覺得這不見得是一個好的機制。

另外執行 go test 會自動執行 go vet。

3. Diagnostics

新增overview of available Go program diagnostic tools.

3. Runtime

LockOSThreadUnlockOSThread 鎖的行為現在是可嵌套的(nested)。這兩個函數的作用是將 goroutine 綁定到特定的作業系統線程上,之前的 go 版本的行為是多次 Lock 等同於一次 Lock,所以不管調用多少次 Lock 只要調用了一次 Unlock 就會達到解鎖的目的。

另外GOMAXPROCS的設定目前沒有限制了。(在 1.9 的時候限制為 1024)。

4. Performance

略有提升。

5. GC

微調。

6. 標準庫

標準庫的改動都比較小,涉及改動的 package 包括 crypto, encoding 等,下面介紹幾個我覺得值得關注的改動。

1. bytes

bytes 裡面的函數 Fields,FieldsFunc,Split,SplitAfter (函數原型如下)返回的 subslice 是指向原來的 slice 的地址,以及沿用之前的 capacity。1.10 版本返回的 subslice 也是指向原來的地址空間,但是 capacity 調整為 subslice 一樣大小,這樣對返回的 subslice 進行 append 操作的時候就會進行記憶體的重新分配,不會影響到別的 subslice。

func Fields(s []byte) [][]byte {...}

範例程式碼: Go 1.10 beta。

package mainimport (    "bytes"    "fmt")func main() {    str := []byte("Hello world")    fields := bytes.Fields(str)    fmt.Printf("filed0 cap: %d. field1 cap: %d.\n", len(fields[0]), len(fields[1]))    _ = append(fields[0], 'X', 'Y')    fmt.Printf("old string: %s. field0: %s. field1: %s.\n", string(str), fields[0], fields[1])}

輸出結果:

➜  go go run bytes_fields.gofiled0 cap: 5. field1 cap: 5.old string: Hello world. field0: Hello. field1: world.

之前版本的輸出結果如下

➜  go go run bytes_fields.gofiled0 cap: 16. field1 cap: 10.old string: HelloXYorld. field0: Hello. field1: Yorld.

2. go/doc

使用 go doc 查看 T 類型的時候,也會返回傳回值為 T, *T, **T 的 slice 的函數。

$ go doc mail.Addresspackage mail // import "net/mail"type Address struct {Name    string Address string}    Address represents a single mail address.func ParseAddress(address string) (*Address, error)func ParseAddressList(list string) ([]*Address, error)func (a *Address) String() string

3. strings

strings 包增加新類型 Builder,可以用來連接字串。

// A Builder is used to efficiently build a string using Write methods.// It minimizes memory copying. The zero value is ready to use.type Builder struct {buf []byte}// String returns the accumulated string.func (b *Builder) String() string {return *(*string)(unsafe.Pointer(&b.buf))}// Len returns the number of accumulated bytes; b.Len() == len(b.String()).func (b *Builder) Len() int { return len(b.buf) }// Reset resets the Builder to be empty.func (b *Builder) Reset() { b.buf = nil }

串連 byte。

// WriteByte appends the byte c to b's buffer.// The returned error is always nil.func (b *Builder) WriteByte(c byte) error {b.buf = append(b.buf, c)return nil}

串連 string。

// WriteString appends the contents of s to b's buffer.// It returns the length of s and a nil error.func (b *Builder) WriteString(s string) (int, error) {b.buf = append(b.buf, s...)return len(s), nil}

4. strconv

現在 strconv 的 ParseUint 函數如果是 ErrRange 錯誤就返回上確界,以前返回的是 0。

package mainimport (    "strconv"    "fmt")func main() {    fmt.Println(strconv.ParseUint("1234", 10, 10))    // output: 1024    fmt.Println(strconv.ParseUint("1234", 10, 11))    // output: 1234} 

5. net/smtp

Client 增加探活函數:Noop。

6. net/url

ResolveReference 函數現在會保留 url 裡面的所有反斜線,之前的版本會把 host 之後的反斜線合并為一個,這樣有時候會導致 redirect 不準確。

package mainimport (    "net/url"    "fmt")func main() {    base, _ := url.Parse("http://host//path//to//page1")    target, _ := url.Parse("page2")    fmt.Println(base.ResolveReference(target))}

Go 1.10 輸出為: http://host//path//to//page2, 老版本輸出為 http://host/path//to//page2

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.