自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Go 1 正式發(fā)布時相比 r60.3 有哪些值得注意的改動?

開發(fā) 前端
Go 1 引入 rune? 類型(int32? 的別名)表示 Unicode 碼點,為 int 擴(kuò)展到 64 位做準(zhǔn)備,同時優(yōu)化字符存儲。

Go 1 值得關(guān)注的改動:

  • 初始化時 goroutine 的啟動時機(jī):Go 1 允許在初始化過程中創(chuàng)建并運(yùn)行 goroutine,不再限制其啟動時機(jī),增強(qiáng)了 init 構(gòu)造的實用性。
  • rune 類型的引入:Go 1 引入 rune 類型(int32 的別名)表示 Unicode 碼點,為將來 int 擴(kuò)展到 64 位做準(zhǔn)備。
  • error 類型和 errors 包:Go 1 將 error 定義為內(nèi)置接口,并引入 errors 包,取代 os.Error,使錯誤處理更通用。
  • 不允許開發(fā)者對 map 的迭代順序有依賴:Go 1 明確規(guī)定 map 的迭代順序不可預(yù)測,禁止依賴特定順序。
  • 多重賦值的細(xì)化:Go 1 明確多重賦值時先從左到右求值所有表達(dá)式,再按順序賦值,確保行為一致。
  • 復(fù)制包含未導(dǎo)出字段的結(jié)構(gòu)體:Go 1 允許復(fù)制包含其他包未導(dǎo)出字段的結(jié)構(gòu)體,提升了 API 設(shè)計的靈活性。
  • 相等性定義的調(diào)整:Go 1 為結(jié)構(gòu)體和數(shù)組定義了相等性,可用作 map 鍵,同時移除函數(shù)和 map 的相等性定義(nil 比較除外)。

下面是一些值得展開的討論:

rune 類型的引入

簡要概括

Go 1 引入 rune 類型(int32 的別名)表示 Unicode 碼點,為 int 擴(kuò)展到 64 位做準(zhǔn)備,同時優(yōu)化字符存儲。

詳細(xì)內(nèi)容

在 Go 1 之前,int 在所有平臺上均為 32 位,這在 64 位平臺上限制了其表示能力,尤其是在索引大數(shù)組時。若直接將 int 擴(kuò)展為 64 位,會因 Unicode 碼點的存儲浪費(fèi)空間。為此,Go 1 引入 rune 類型,作為 int32 的別名,專門表示 Unicode 碼點。字符字面量如 'a'、'語' 和 '\u0345' 的默認(rèn)類型變?yōu)?nbsp;rune,類似于 1.0 默認(rèn)類型為 float64。未顯式指定類型的字符常量變量將具有 rune 類型。標(biāo)準(zhǔn)庫中的函數(shù),如 unicode.ToLower,也更新為接受和返回 rune 類型。

以下是一個示例:

delta := 'δ' // delta 的類型為 rune
var DELTA rune
DELTA = unicode.ToUpper(delta)
epsilon := unicode.ToLower(DELTA + 1)
if epsilon != 'δ'+1 {
    log.Fatal("inconsistent casing for Greek")
}

更新影響:由于類型推斷(type inference)會自動引入 rune,大多數(shù)代碼不受影響。少數(shù)代碼可能需添加簡單的類型轉(zhuǎn)換以解決類型錯誤。

error 類型和 errors 包

簡要概括

Go 1 將 error 定義為內(nèi)置接口,并引入 errors 包,取代 os.Error 和 os.NewError,使錯誤處理更通用和靈活。

詳細(xì)內(nèi)容

在 Go 1 之前,os.Error 位于 os 包中,這源于歷史原因,但其局限性逐漸顯現(xiàn):錯誤處理比操作系統(tǒng)更基礎(chǔ),且在 syscall 等包中使用 os.Error 會引入不必要的依賴。Go 1 通過內(nèi)置 error 接口解決此問題:

type error interface {
    Error() string
}

同時引入 errors 包,提供 New 函數(shù)創(chuàng)建錯誤:

func New(text string) error

fmt 包會自動調(diào)用 Error 方法打印錯誤值。開發(fā)者可自定義錯誤類型,只需實現(xiàn) Error 方法:

type SyntaxError struct {
    File    string
    Line    int
    Message string
}

func (se *SyntaxError) Error() string {
    return fmt.Sprintf("%s:%d: %s", se.File, se.Line, se.Message)
}

此外,syscall 包現(xiàn)在返回 error 類型。在 Unix 平臺上,系統(tǒng)調(diào)用錯誤由 syscall.Errno 實現(xiàn),滿足 error 接口。

更新影響運(yùn)行 go fix 可更新大部分代碼。若錯誤類型定義了 String 方法,需手動改為 Error 方法。建議使用 os 包而非 syscall 以減少影響。

map 迭代順序不可預(yù)測

簡要概括

Go 1 明確規(guī)定 map 的迭代順序不可預(yù)測,禁止開發(fā)者依賴特定順序,以提升 map 實現(xiàn)的靈活性。

詳細(xì)內(nèi)容

在 Go 1 之前,map 的迭代順序未在語言規(guī)范中定義,且因硬件平臺不同而異,導(dǎo)致測試不穩(wěn)定。Go 1 使用 for range 迭代 map 時,元素訪問順序被定義為不可預(yù)測,即使同一 map 多次運(yùn)行也如此。代碼不應(yīng)假設(shè)元素按特定順序訪問:

m := map[string]int{"Sunday": 0, "Monday": 1}
for name, value := range m {
    // 此循環(huán)不應(yīng)假設(shè) Sunday 先被訪問
    f(name, value)
}

此更改確保依賴順序的代碼盡早失敗并修復(fù),同時允許 map 實現(xiàn)優(yōu)化性能和平衡性。

更新影響:工具無法自動修復(fù),需手動檢查所有 map 的 range 語句,確保不依賴迭代順序。標(biāo)準(zhǔn)庫中相關(guān)代碼已修復(fù)。之前依賴未定義順序的代碼本就錯誤,此更改僅明確了不可預(yù)測性。

多重賦值的細(xì)化

簡要概括

Go 1 明確多重賦值時先從左到右求值所有表達(dá)式,再按順序賦值,確保行為可預(yù)測。

詳細(xì)內(nèi)容

語言規(guī)范長期保證賦值時先求值右側(cè)表達(dá)式,再賦值給左側(cè)。Go 1 進(jìn)一步細(xì)化:若左側(cè)包含需求值的表達(dá)式(如函數(shù)調(diào)用或數(shù)組索引),這些表達(dá)式按從左到右順序求值,然后再賦值:

sa := []int{1, 2, 3}
i := 0
i, sa[i] = 1, 2 // 設(shè)置 i = 1, sa[0] = 2

sb := []int{1, 2, 3}
j := 0
sb[j], j = 2, 1 // 設(shè)置 sb[0] = 2, j = 1

sc := []int{1, 2, 3}
sc[0], sc[0] = 1, 2 // 先設(shè)置 sc[0] = 1,再設(shè)置為 2

更新影響:工具無法自動修復(fù),但影響甚微。標(biāo)準(zhǔn)庫代碼未受影響,依賴之前未定義行為的代碼本就錯誤。

復(fù)制包含未導(dǎo)出字段的結(jié)構(gòu)體

簡要概括

Go 1 允許復(fù)制包含其他包未導(dǎo)出字段的結(jié)構(gòu)體,增強(qiáng)了 API 設(shè)計的靈活性。

詳細(xì)內(nèi)容

在 Go 1 之前,語言禁止復(fù)制包含其他包未導(dǎo)出字段的結(jié)構(gòu)體,但方法接收者和 copy、append 函數(shù)未受此限。Go 1 放寬限制,允許復(fù)制此類結(jié)構(gòu)體,使包可返回不透明值而無需指針或接口,如 time.Time 和 reflect.Value

// 包 p 的定義
type Struct struct {
    Public int
    secret int
}

func NewStruct(a int) Struct { // 返回值類型為 Struct 而非 *Struct
    return Struct{a, f(a)}
}

func (s Struct) String() string {
    return fmt.Sprintf("{%d (secret %d)}", s.Public, s.secret)
}

// 導(dǎo)入 p 包的代碼
import "p"

myStruct := p.NewStruct(23)
copyOfMyStruct := myStruct
fmt.Println(myStruct, copyOfMyStruct)

更新影響:此為新特性,現(xiàn)有代碼無需更改。

相等性定義的調(diào)整

簡要概括

Go 1 為結(jié)構(gòu)體和數(shù)組定義了相等性,可用作 map 鍵,同時移除函數(shù)和 map 的相等性(nil 比較除外)。

詳細(xì)內(nèi)容

在 Go 1 之前,結(jié)構(gòu)體和數(shù)組的相等性未定義,無法用作 map 鍵,而函數(shù)和 map 的相等性定義存在問題。Go 1 引入結(jié)構(gòu)體和數(shù)組的相等性(== 和 !=),采用逐元素比較

type Day struct {
    long  string
    short string
}

Christmas := Day{"Christmas", "XMas"}
Thanksgiving := Day{"Thanksgiving", "Turkey"}
holiday := map[Day]bool{
    Christmas:    true,
    Thanksgiving: true,
}
fmt.Printf("Christmas is a holiday: %t\n", holiday[Christmas])

函數(shù)相等性(nil 比較除外)和 map 相等性被移除,因其定義復(fù)雜且不符合用戶期望。slice 的相等性仍未定義。

更新影響:結(jié)構(gòu)體和數(shù)組相等性為新特性,現(xiàn)有代碼無需更改。依賴函數(shù)或 map 相等性的代碼需手動修復(fù)。

責(zé)任編輯:姜華 來源: Piper蛋窩
相關(guān)推薦

2025-04-18 08:07:12

2025-04-14 08:06:04

2025-04-15 08:00:53

2025-04-17 08:00:48

2025-04-25 08:01:12

Go應(yīng)用程序部署

2025-04-21 00:00:00

Go 開發(fā)Go 語言Go 1.9

2025-04-14 00:00:04

2025-04-21 00:05:00

2025-04-21 08:00:56

2025-04-22 08:02:23

2025-04-23 08:02:40

2025-04-24 09:01:46

2025-04-27 08:00:35

2025-04-27 00:00:01

Go 1.16Go 1.15接口

2025-04-11 08:02:38

2025-04-14 00:00:00

2010-07-12 10:48:21

SQL Server數(shù)

2010-08-06 10:51:16

使用IBM DB2

2010-07-21 16:28:33

職場

2015-06-23 15:48:41

Swift 2.0iOS9
點贊
收藏

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