新聞中心
Go 1.1 介紹

10年積累的網(wǎng)站建設(shè)、做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有臺(tái)江免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
Go ***版(簡(jiǎn)稱 Go 1 或 Go 1.0)發(fā)布于 2012 年三月,這個(gè)版本提供了穩(wěn)定的 Go 語言和庫。其穩(wěn)定性讓全世界 Go 用戶社區(qū)和相關(guān)系統(tǒng)茁壯成長(zhǎng)。從那時(shí)起,就發(fā)布了若干個(gè)“關(guān)鍵點(diǎn)”——1.0.1、1.0.2 和 1.0.3。這些點(diǎn)的發(fā)布修復(fù)了若干已知 bug,但是對(duì)于實(shí)現(xiàn)本身并沒有進(jìn)行修改。
這個(gè)新的發(fā)布版,Go 1.1,在保持兼容性的前提下添加了若干重要的(當(dāng)然,向后兼容)語言變化,而庫變化的清單也很長(zhǎng)(也向后兼容),還有在編譯器、庫和運(yùn)行時(shí)環(huán)境實(shí)現(xiàn)的主要工作。焦點(diǎn)是性能。測(cè)試并不是十分精確,但是對(duì)于許多測(cè)試程序來說都有著重要的、有時(shí)是戲劇性的性能改善。我們相信,通過升級(jí) Go 的安裝包,并且重新編譯,許多用戶的程序也能讓人體會(huì)到這一改進(jìn)。
這一文檔匯總了從 Go 1 到 Go 1.1 的變化。雖然這個(gè)發(fā)布版有一些極為罕見的錯(cuò)誤情況,而當(dāng)這些情況在發(fā)生時(shí)必須被處理。在 Go 1.1 下運(yùn)行,幾乎不需要修改任何代碼。下面描述了細(xì)節(jié);參閱 64 位整數(shù)和 Unicode 文字的特別說明。
語言的變化
Go 的兼容性文檔保證了用 Go 1 語言規(guī)范編寫的程序仍然可以使用,并且可以會(huì)繼續(xù)被維護(hù)。盡管有一些細(xì)節(jié)的錯(cuò)誤情況已經(jīng)被指出,但是規(guī)范本身的完善還是相當(dāng)有趣的。同時(shí)還增加了一些語言的新特性。
整數(shù)除以零
在 Go 1 中,整數(shù)被一個(gè)常量零整除會(huì)產(chǎn)生一個(gè)運(yùn)行時(shí) panic:
- func f(x int) int {
- return x/0
- }
在 Go 1.1 中,一個(gè)整數(shù)被一個(gè)常量零整除不是合法的程序,因此這會(huì)是一個(gè)編譯時(shí)錯(cuò)誤。
代用的 Unicode 文字
細(xì)化了 string 和 rune 文字的定義,以便將代用部分排除在合法的 Unicode 編碼值以外。參閱 Unicode 部分了解更多信息。
方法值
現(xiàn)在 Go 1.1 實(shí)現(xiàn)了方法值,也就是將函數(shù)綁定在特定的接收者的值上。例如,有一個(gè)Writer 的值 w,表達(dá)式 w.Write,是一個(gè)方法值,作為用于向 w 寫入的函數(shù);這與函數(shù)文法中對(duì) w 進(jìn)行閉包是等價(jià)的:
- func (p []byte) (n int, err error) {
- return w.Write(p)
- }
方法值與方法表達(dá)式是不同的,方法表達(dá)式從方法中利用指定的類型構(gòu)造了一個(gè)函數(shù);方法表達(dá)式 (*bufio.Writer).Write 與***個(gè)參數(shù)類型指定為 (*bufio.Writer) 的函數(shù)等價(jià):
- func (w *bufio.Writer, p []byte) (n int, err error) {
- return w.Write(p)
- }
更新:已有代碼不受影響;這個(gè)變動(dòng)是嚴(yán)格的向后兼容。
Return requirements
在 Go 1.1 之前,一個(gè)函數(shù)返回一個(gè)值必須明確的在函數(shù)結(jié)束時(shí)“return”或調(diào)用 panic;這是一個(gè)讓程序明確函數(shù)的概念的簡(jiǎn)單的途徑。但是,顯然有許多情況***的“return”沒有必要,例如, 一個(gè)只有死循環(huán)“for”的函數(shù)。
在 Go 1.1 中,關(guān)于***的“return”語句的規(guī)則更加寬松。它引入了一個(gè)終止語句的概念,它保證了在函數(shù)中這個(gè)語句總是***被執(zhí)行。例如在沒有條件的“for”循環(huán)中,也沒有“if-else”語句用來在中間通過“return”結(jié)束。那么函數(shù)的***一個(gè)語句可以在語法上被認(rèn)為是終止語句,而不需要***的“return”語句。
注意這個(gè)規(guī)則純粹是語法上的:它并不關(guān)注代碼中的值,因此也沒有復(fù)雜的分析。
更新:這個(gè)變動(dòng)是向后兼容的,不過有著多余“return”語句或調(diào)用 panic 的已有代碼可能需要手工處理一下。這些代碼可用 go vet 來標(biāo)識(shí)。
實(shí)現(xiàn)和工具的變更
命令行參數(shù)解析
在 gc 工具鏈中,編譯器和鏈接器現(xiàn)在使用與 Go 的 flag 包一致的命令行參數(shù)解析規(guī)則,而與傳統(tǒng)的 Unix 參數(shù)解析背道而馳。這可能會(huì)對(duì)直接調(diào)用工具的腳本產(chǎn)生影響。例如,go tool 6c -Fw -Dfoo 現(xiàn)在必須寫為 go tool 6c -F -w -D foo。
在 64 位平臺(tái)上的整數(shù)大小
該語言允許根據(jù)具體實(shí)現(xiàn)選擇 int 類型和 uint 類型是 32 或 64 位的。之前 Go 的實(shí)現(xiàn)是在所有系統(tǒng)上都讓 int 和 uint 是 32 位的。現(xiàn)在 gc 和 gccgo 的實(shí)現(xiàn)都讓 int 和 uint 在如 AMD64/x86-64 這樣的平臺(tái)上是 64 位的。拋開別的不說,單這個(gè)就使得 slice 在 64 位平臺(tái)上可以分配超過 20 億的元素。
更新:大多數(shù)程序不會(huì)受到這個(gè)的影響。 由于 Go 不允許不同數(shù)字類型之間的隱式轉(zhuǎn)換,不會(huì)有程序在編譯時(shí)報(bào)錯(cuò)。然而,那些隱式假設(shè) int 是 32 位的程序,在行為上可能發(fā)生變化。例如,這個(gè)程序在 64 位系統(tǒng)中會(huì)打印正數(shù),在 32 位系統(tǒng)中會(huì)打印復(fù)數(shù):
- x := ^uint32(0) // x is 0xffffffff
- i := int(x) // i is -1 on 32-bit systems, 0xffffffff on 64-bit
- fmt.Println(i)
要保留 32 位的符號(hào)(在所有系統(tǒng)上都是 -1)應(yīng)該用下面的具有可移植性的代碼代替:
- i := int(int32(x))
Unicode
為了能夠表達(dá) UTF-16 中超過 65535 的編碼值,Unicode 定義了代用部分,一個(gè)僅用于組裝更大的值的編碼值范圍,且僅在 UTF-16 中。在這個(gè)代用范圍內(nèi)的編碼值如果用于其他任何情況都是非法的,如作為 UTF-8 編碼,或作為獨(dú)立的 UTF-16 編碼。例如在遇到將一個(gè) rune 轉(zhuǎn)換成 UTF-8 時(shí),它被當(dāng)作一個(gè)編碼錯(cuò)誤對(duì)待,并產(chǎn)生一個(gè)替代的 rune,utf8.RuneError, U+FFFD。
這個(gè)程序,
- import "fmt"
- func main() {
- fmt.Printf("%+q\n", string(0xD800))
- }
在 Go 1.0 中打印“\ud800”,但在 Go 1.1 中打印“\ufffd”。
半個(gè)代用 Unicode 值現(xiàn)在在 rune 和 string 常量中都是非法的,因此如“\ud800”和“\ud800”的常量現(xiàn)在會(huì)被編譯器拒絕。當(dāng)編寫為獨(dú)立的 UTF-8 編碼的字節(jié)時(shí),這樣字符串還是可以被創(chuàng)建的,例如“\xed\xa0\x80”。然而,當(dāng)這個(gè)字符串被作為一個(gè) rune 序列解碼時(shí),比如在 range 循環(huán)中,它只會(huì)生成 utf8.RuneError 值。
Unicode 字節(jié)順序讓 U+FFFE 和 U+FEFF 在 UTF-8 編碼下可以作為 Go 源碼的***個(gè)字符出現(xiàn)。雖然在字節(jié)順序未設(shè)定的 UTF-8 編碼中,它是完全不必要的,不過有些編輯器會(huì)將其作為“魔法數(shù)值”添加進(jìn)去,用來標(biāo)識(shí)一個(gè) UTF-8 編碼的文件。
更新:大多數(shù)程序不會(huì)受到代用變更的影響?;谂f的行為的程序應(yīng)當(dāng)通過修改來避免問題。字節(jié)順序標(biāo)識(shí)的變更是嚴(yán)格向后兼容的。
gc 匯編
基于如 int 到 64 位和其他一些變化,在 gc 工具鏈的函數(shù)參數(shù)的棧布局發(fā)生了變化。使用匯編編寫的函數(shù)至少需要一個(gè) frame 指針偏移量。
更新:現(xiàn)在 go vet 命令可以檢查用匯編實(shí)現(xiàn)的函數(shù)是否匹配 Go 的函數(shù)原型。
go 命令的變化
為了讓新的 Go 用戶獲得更好的體驗(yàn),go 命令做了若干改動(dòng)。
首先,當(dāng)編譯、測(cè)試或運(yùn)行 Go 代碼的時(shí)候,go 命令會(huì)給出更多的錯(cuò)誤信息細(xì)節(jié),當(dāng)一個(gè)包無法被定位時(shí),會(huì)列出搜索的路徑清單。
- $ go build foo/quxx
- can't load package: package foo/quxx: cannot find package "foo/quxx" in any of:
- /home/you/go/src/pkg/foo/quxx (from $GOROOT)
- /home/you/src/foo/quxx (from $GOPATH)
其次,go get 命令不再允許下載包源碼時(shí),將 $GOROOT 作為默認(rèn)的目的路徑。要使用 go get 命令,必須有一個(gè)合法的 $GOPATH。
- $ GOPATH= go get code.google.com/p/foo/quxx
- package code.google.com/p/foo/quxx: cannot download, $GOPATH not set. For more details see: go help gopath
***,作為前面變化的結(jié)果,go get 命令會(huì)在 $GOPATH 和 $GOROOT 設(shè)置為相同值的時(shí)候報(bào)錯(cuò)。
- $ GOPATH=$GOROOT go get code.google.com/p/foo/quxx
- warning: GOPATH set to GOROOT (/home/User/go) has no effect
- package code.google.com/p/foo/quxx: cannot download, $GOPATH must not be set to $GOROOT. For more details see: go help gopath
go test 命令的變化
go test 命令在進(jìn)行性能測(cè)試時(shí)不再刪除二進(jìn)制內(nèi)容,以便更容易的分析性能測(cè)試。實(shí)現(xiàn)上是在運(yùn)行的時(shí)候設(shè)置了 -c 參數(shù)。
- $ go test -cpuprofile cpuprof.out mypackage
在 go test 運(yùn)行之后,mypackage.test 將會(huì)留在目錄中。
go test 命令現(xiàn)在可以報(bào)告 goroutine 在哪里阻塞的測(cè)試信息,也就是說,它們?cè)谀囊恢钡戎硞€(gè)事件,例如一個(gè) channel 通訊之類的。當(dāng)用 -blockprofile 開啟 go test 的阻塞測(cè)試時(shí),就會(huì)展示這些信息。 運(yùn)行 go help test 了解更多信息。
go fix 命令的變化
fix 命令通常以 go fix 執(zhí)行,不再提供從 Go1 之前的版本升級(jí)到 Go 1 API 的功能。如果要升級(jí) Go 1 之前的代碼到 Go 1.1,首先應(yīng)當(dāng)使用 Go 1.0 的工具鏈,將代碼轉(zhuǎn)化到 Go 1.0。
性能
用 Go 1.1 的 gc 工具集編譯出來的代碼的性能對(duì)于大多數(shù) Go 程序來說應(yīng)當(dāng)有顯著的提升。一般來說,與 Go 1.0 相比,大約有 30%-40% 的提升,有時(shí)甚至更高,當(dāng)然也會(huì)比這個(gè)值低,甚至沒有提升。對(duì)于工具和庫來說,有太多的小的性能驅(qū)使的改動(dòng),以至于無法將它們?nèi)苛性谶@里。不過下面的主要變更還是有必要留意的:
gc 編譯器在大多數(shù)情況下都會(huì)生成較好的代碼,尤其是在 32 位 Intel 架構(gòu)下的浮點(diǎn)值。
·gc 編譯器做了更多的內(nèi)連,包括在運(yùn)行時(shí)的一些操作,例如 append 和接口轉(zhuǎn)換。
·Go 的 map 有了新的實(shí)現(xiàn),在內(nèi)存復(fù)制和 CPU 時(shí)間上有了重大的改進(jìn)。
·垃圾回收實(shí)現(xiàn)了更多的并行,這可以降低在多 CPU 環(huán)境下運(yùn)行的程序的延遲。
·垃圾回收同時(shí)也更加精準(zhǔn),這增加了一點(diǎn) CPU 時(shí)間開銷,但是極大的降低了堆的大小,尤其是在 32 位的架構(gòu)下。
·通過緊密結(jié)合運(yùn)行時(shí)和網(wǎng)絡(luò)庫,在網(wǎng)絡(luò)操作時(shí)需要的上下文切換會(huì)更少。
#p#
標(biāo)準(zhǔn)庫的變化
bufio.Scanner
在 bufio 包中有多種方式獲取文本輸入,ReadBytes、ReadString 和特別的 ReadLine,對(duì)于簡(jiǎn)單的目的這些都有些過于復(fù)雜了。在 Go 1.1 中,添加了一個(gè)新類型,Scanner,以便更容易的處理如按行讀取輸入序列或空格分隔的詞等,這類簡(jiǎn)單的任務(wù)。它終結(jié)了如輸入一個(gè)很長(zhǎng)的有問題的行這樣的輸入錯(cuò)誤,并且提供了簡(jiǎn)單的默認(rèn)行為:基于行的輸入,每行都剔除分隔標(biāo)識(shí)。這里的代碼展示來一次輸入一行:
- scanner := bufio.NewScanner(os.Stdin)
- for scanner.Scan() {
- fmt.Println(scanner.Text()) // Println will add back the final '\n'
- }
- if err := scanner.Err(); err != nil {
- fmt.Fprintln(os.Stderr, "reading standard input:", err)
- }
輸入的行為可以通過一個(gè)函數(shù)控制,來控制輸入的每個(gè)部分(參閱 SplitFunc 的文檔),但是對(duì)于復(fù)雜的問題或持續(xù)傳遞錯(cuò)誤的,可能還是需要原有接口。
net
在 net 包中的協(xié)議特定的解析器之前對(duì)傳遞入的網(wǎng)絡(luò)名很寬松。雖然文檔明確指出對(duì)于ResolveTCPAddr 合法的網(wǎng)絡(luò)名只有“tcp”,“tcp4”和“tcp6”,Go 1.0 的實(shí)現(xiàn)對(duì)于任何字符串都會(huì)接受。而 Go 1.1 的實(shí)現(xiàn),如果網(wǎng)絡(luò)名不在這些字符串中,就會(huì)返回一個(gè)錯(cuò)誤。這對(duì)于其他協(xié)議特定的解析器 ResolveIPAddr、ResolveUDPAddr 和ResolveUnixAddr 也是一樣。
之前的的實(shí)現(xiàn),ListenUnixgram 返回一個(gè) UDPConn 作為接收連接的端點(diǎn)。在 Go 1.1 的實(shí)現(xiàn)里,用 UnixConn 來代替,這允許用它的 ReadFrom 和 WriteTo 方法讀寫。
數(shù)據(jù)結(jié)構(gòu) IPAddr、TCPAddr 和 UDPAddr 添加了一個(gè)叫做 Zone 的新字符串字段。由于新的字段,使用沒有標(biāo)簽的復(fù)合文法(例如 net.TCPAddr{ip, port})的代碼代替有標(biāo)簽的文法(net.TCPAddr{IP: ip, Port: port})會(huì)出錯(cuò)。Go 1 的兼容性規(guī)則允許這個(gè)變化:客戶端代碼必須使用標(biāo)簽化的文法以避免這種破壞。
更新:為了修正由于新的結(jié)構(gòu)體字段帶來的破壞,go fix 將會(huì)重寫這些類型的代碼以添加標(biāo)簽。更通用的是,go vet 將會(huì)標(biāo)識(shí)出所有應(yīng)當(dāng)使用字段標(biāo)簽的復(fù)合文法。
reflect
reflect 包有若干重大改進(jìn)。
現(xiàn)在用 reflect 包返回一個(gè)“select”語句是可能的;參閱 Select 和 SelectCase 了解更多細(xì)節(jié)。
新的方法 Value.Convert(或 Type.ConvertibleTo)提供了對(duì)一個(gè) Value 進(jìn)行 Go 的轉(zhuǎn)換和類型斷言操作(或者是檢測(cè)這種可能性)的函數(shù)方式。
新的函數(shù) MakeFunc 創(chuàng)建了一個(gè)使得在已有 Value 上調(diào)用函數(shù)更加容易的封裝函數(shù),可以用于標(biāo)準(zhǔn)的 Go 參數(shù)的轉(zhuǎn)換,例如將一個(gè) int 傳遞為 interface{}。
***,新的函數(shù) ChanOf、MapOf 和 SliceOf 可以從已有類型中構(gòu)造新 Type,例如在僅提供 T 的情況下構(gòu)造 []T。
time
之前的 time 包在 FreeBSD、Linux、NetBSD、OS X 和 OpenBSD 上精確到微秒。Go 1.1 在這些操作系統(tǒng)上的實(shí)現(xiàn)可以精確到納秒。程序用微妙的精確度想外部寫入再讀出,若覆蓋掉原有值的話,將會(huì)產(chǎn)生精度的損失。Time 有兩個(gè)新方法,Round 和Truncate,可以用來在向外部存儲(chǔ)寫入前,從時(shí)間里去除精度。
新方法 YearDay 返回指定 time 值在一年中的某天的唯一整數(shù)序數(shù)。
Timer 類型有一個(gè)新方法 Reset,讓定時(shí)器在指定的間隔后過期。
***,一個(gè)新函數(shù) ParseInLocation 與已有的 Parse 類似,不過會(huì)忽略解析的字符串中的時(shí)區(qū)信息,而使用傳入的位置(時(shí)區(qū))來解析時(shí)間。這個(gè)函數(shù)解決了時(shí)間 API 中常見的混亂情況。
更新:對(duì)于那些使用更低精度的外部格式來讀寫時(shí)間的代碼,應(yīng)當(dāng)修改用新的方法。
Exp 舊的代碼樹移動(dòng)到 go.exp 和 go.text 子版本庫
為了讓使用二進(jìn)制發(fā)布版的用戶在需要的時(shí)候訪問更加容易,不包含在二進(jìn)制發(fā)布版的 exp 和舊的源碼樹被移動(dòng)到新的子版本庫 code.google.com/p/go.exp。舉例來說,如果要訪問 ssa 包,執(zhí)行
- $ go get code.google.com/p/go.exp/ssa
然后在 Go 代碼中,
- import "code.google.com/p/go.exp/ssa"
舊的包 exp/norm 也遷移到了新的版本庫 go.text,這里包含了正在開發(fā)的 Unicode API 和其他文本相關(guān)的包。
庫的微小變更
下面的清單列出了庫的微小改動(dòng),大多數(shù)是一些增強(qiáng)。對(duì)于每個(gè)變更可參閱包相關(guān)的文檔了解更多信息。
bytes 包有兩個(gè)新函數(shù),TrimPrefix 和 TrimSuffix,含義不言而喻。同樣,Buffer 類型有一個(gè)新方法 Grow,提供了一些控制緩存內(nèi)部?jī)?nèi)存分配的能力。***,Reader 類型現(xiàn)在有 WriteTo 方法,因此它也實(shí)現(xiàn)了 io.WriterTo 接口。
crypto/hmac 有一個(gè)新函數(shù),Equal,來比較兩個(gè) MAC。
crypto/x509 包現(xiàn)在支持 PEM 塊(實(shí)例參閱 DecryptPEMBlock),以及一個(gè)新的函數(shù) ParseECPrivateKey 用來解析橢圓曲線私鑰。
database/sql 包在 DB 類型上有了新的 Ping 方法用于檢測(cè)連接的健康狀況。
database/sql/driver 有了一個(gè)新的 Queryer 接口,這樣 Conn 可以通過實(shí)現(xiàn)該接口對(duì)性能做一些改進(jìn)。
encoding/json 包的 Decoder 有了新方法 Buffered,以提供訪問在其緩存內(nèi)剩余數(shù)據(jù)的功能,同樣新方法 UseNumber 會(huì)將一個(gè)值解碼為其實(shí)是字符串的新類型 Number,而不是一個(gè) float64。
encoding/xml 包有了一個(gè)新函數(shù) EscapeText,用于輸出 escape 過的 XML,Encoder 的方法 Inden 則專門用于輸出帶縮進(jìn)的格式。
在 go/ast 包中,新類型 CommentMap 和其關(guān)聯(lián)的方法使得從 Go 程序中分離和處理注釋變得更加容易。
在 go/doc 包中,解析器現(xiàn)在可以更好的跟蹤一些如 TODO 這樣的標(biāo)識(shí),godoc 命令可以根據(jù) -notes 參數(shù)選擇過濾或呈現(xiàn)這些信息。
一個(gè)新的包,go/format,為程序提供了更加方便的方式來獲得 gofmt 的格式化的能力。它有兩個(gè)函數(shù),Node 用來格式化 Go 的解析 Node,而 Source 用來格式化 Go 的源代碼。
html/template 包中沒有文檔并且只部分實(shí)現(xiàn)的“noescape”特性被移除;那些依賴它的程序會(huì)被破壞。
io 包現(xiàn)在將 io.ByteWriter 接口導(dǎo)出,用以滿足一次寫一個(gè)字節(jié)這樣的常見功能。
log/syslog 包現(xiàn)在更好的提供了系統(tǒng)特定的日志功能。
math/big 包的 Int 類型現(xiàn)在有了方法 MarshalJSON 和 UnmarshalJSON 用以轉(zhuǎn)換到或從 JSON 格式轉(zhuǎn)換。同樣,Int 現(xiàn)在可以通過 Uint64 和 SetUint64 直接轉(zhuǎn)換到 uint64 或從 uint64 轉(zhuǎn)換,而 Rat 通過 Float64 and SetFloat64.
mime/multipart 包的 Writer 有了新的方法,SetBoundary 用來定義包輸出的邊界分隔。
net 包的 ListenUnixgram 函數(shù)修改了返回值的類型:現(xiàn)在它返回 UnixConn 而不是 UDPConn,這明顯是 Go 1.0 的一個(gè)錯(cuò)誤。因此這個(gè) API 的變更修復(fù)了一個(gè) bug,這符合 Go 1 的兼容性規(guī)則。
net 包包含了一個(gè)新函數(shù),DialOpt,為 Dial 增加選項(xiàng)。每個(gè)選項(xiàng)都由新的接口 DialOption 體現(xiàn)。新的函數(shù) Deadline、Timeout、Network 和 LocalAddress 然會(huì)一個(gè) DialOption。
net 增加了帶區(qū)域驗(yàn)證的本地 IPv6 地址的支持,如 fe80::1%lo0。地址結(jié)構(gòu)體 IPAddr、UDPAddr 和 TCPAddr 將區(qū)域信息記錄在一個(gè)新的字段里,那些需要字符串格式作為地址的函數(shù),例如 Dial、ResolveIPAddr、ResolveUDPAddr 和 ResolveTCPAddr 現(xiàn)在接受帶區(qū)域驗(yàn)證的格式。
net 包添加了 LookupNS 作為解析函數(shù)。LookupNS 根據(jù)主機(jī)名返回一個(gè) NS records 。
net 包向 IPConn(ReadMsgIP 和 WriteMsgIP)和 UDPConn(ReadMsgUDP 和 WriteMsgUDP)加了指定協(xié)議的讀寫方法。還有個(gè) PacketConn 的特別版本的 ReadFrom 和 WriteTo 方法,提供了訪問數(shù)據(jù)包的帶外數(shù)據(jù)的能力。
net 為 UnixConn 添加了方法以便半關(guān)閉連接(CloseRead 和 CloseWrite),這與 TCPConn 的已有方法匹配。
net/http 包包含了若干新增。ParseTime 解析一個(gè)時(shí)間字符串,會(huì)嘗試若干種常見的 HTTP 時(shí)間格式。Request 的 PostFormValue 方法與 FormValue 類似,不過忽略了 URL 參數(shù)。CloseNotifier 接口提供了服務(wù)器端處理程序發(fā)現(xiàn)客戶端斷開連接的一種機(jī)制。ServeMux 類型現(xiàn)在有了 Handler 方法來訪問 Handler 的路徑而不需要執(zhí)行它。Transport 現(xiàn)在可以通過 CancelRequest 取消一個(gè)正在進(jìn)行的請(qǐng)求。***, 當(dāng) Response.Body 在完全被處理之前被關(guān)閉的話,Transport 現(xiàn)在會(huì)對(duì)關(guān)閉 TCP 連接保持更樂觀的態(tài)度。
新的 net/http/cookiejar 包提供了基礎(chǔ)的管理 HTTP cookie 的功能。
net/mail 包有了兩個(gè)新函數(shù),ParseAddress 和 ParseAddressList,來解析 RFC 5322 格式化的地址到 Address 結(jié)構(gòu)體。
net/smtp 包的 Client 類型有了一個(gè)新的方法,Hello,用于向服務(wù)器發(fā)送 HELO 或 EHLO 消息。
net/textproto 有兩個(gè)新函數(shù),TrimBytes 和 TrimString,用來僅在 ASCII 下進(jìn)行前后空符的切除。
新方法 os.FileMode.IsRegular 讓了解一個(gè)文件是否是普通文件變得更加簡(jiǎn)單。
image/jpeg 現(xiàn)在可以讀取預(yù)加載 JPEG 文件,并且處理某些二次取樣配置信息。
regexp 包現(xiàn)在通過 Regexp.Longest 可以支持 Unix 原生的最左最長(zhǎng)匹配,而 Regexp.Split 使用正則表達(dá)式定義的分離器將字符串分解成組的。
runtime/debug 有三個(gè)關(guān)于內(nèi)存使用的新函數(shù)。FreeOSMemory 函數(shù)觸發(fā)垃圾回收,并嘗試將未使用的內(nèi)存退回操作系統(tǒng);ReadGCStats 獲得控制器的統(tǒng)計(jì)信息;而 SetGCPercent 提供了一個(gè)可編程的途徑來控制控制器執(zhí)行頻率,包括永遠(yuǎn)禁止其執(zhí)行。
sort 包有一個(gè)新函數(shù),Reverse。作為調(diào)用 sort.Sort 的參數(shù)的包裹,通過調(diào)用 Reverse 可以讓排序結(jié)果反續(xù)。
strings 包有兩個(gè)新函數(shù),TrimPrefix 和 TrimSuffix 含義不言而喻,還有 Reader.WriteTo 方法,因此 Reader 現(xiàn)在實(shí)現(xiàn)了 io.WriterTo 接口。
syscall 包的有許多更新,包括對(duì)每個(gè)支持的操作系統(tǒng)的系統(tǒng)調(diào)用進(jìn)行加固。
testing 包現(xiàn)在可以在性能測(cè)試中使用 AllocsPerRun 函數(shù)和 BenchmarkResult 的 AllocsPerOp 方法自動(dòng)生成內(nèi)存分配統(tǒng)計(jì)。還有 Verbose 函數(shù)來檢測(cè) -v 的命令行參數(shù)狀態(tài),和testing.B 和 testing.T 的新方法 Skip 來簡(jiǎn)單跳過一些不必要的測(cè)試。
在 text/template 和 html/template 包中,模板現(xiàn)在可以用圓括號(hào)來對(duì)字符序列分組,這簡(jiǎn)化了創(chuàng)建復(fù)雜的字符序列的過程。TODO:鏈接到一個(gè)實(shí)例。同時(shí),作為新的解析器的一部分,Node 接口有兩個(gè)方法用來提供更好的錯(cuò)誤報(bào)告。這同樣遵循 Go 1 兼容性規(guī)則,由于這個(gè)接口被明確期望只有text/template 和 html/template 包使用,而其安全機(jī)制保證了這點(diǎn),所以應(yīng)當(dāng)沒有代碼會(huì)受到影響。
在 unicode/utf8 包中,新函數(shù) ValidRune 報(bào)告了一個(gè) rune 是否是一個(gè)合法的 Unicode 編碼值。為了確保合法,rune 的值必須在范圍內(nèi),且不能為半個(gè)代用符。
unicode 包的實(shí)現(xiàn)被更新到 Unicode 7.2.0 版本。
網(wǎng)站標(biāo)題:Go1.1介紹
網(wǎng)頁鏈接:http://www.dlmjj.cn/article/cdpgcec.html


咨詢
建站咨詢
