網(wǎng)站建設(shè)介紹nba最新交易一覽表
預(yù)期中的Go 2不會(huì)有了,1.20也算是一個(gè)小gap,從中可以一窺Go未來(lái)的發(fā)展之路。對(duì)于Go來(lái)說(shuō),未來(lái)保持1.x持續(xù)演進(jìn)和兼容性之外,重點(diǎn)就是讓Go性能更優(yōu),同時(shí)保持大道至簡(jiǎn)原則,使用盡可能容易,從這兩個(gè)方面帶大家看看你1.20值得關(guān)注的特性。
優(yōu)化相關(guān)
編譯速度
1.18引入泛型,降低了編譯速度,這一般版本基本上優(yōu)化和1.17平齊,當(dāng)前1.20的編譯也是依賴Go 1.17版本自舉。如果沒泛型剛需的,可以等到1.20穩(wěn)定后升級(jí)。
內(nèi)存優(yōu)化area
引入新的內(nèi)存分配機(jī)制arena,支持手動(dòng)管理內(nèi)存,部分場(chǎng)景提升5%-15%,可參考golang新特性arena,帶你起飛。
編譯優(yōu)化pgo
全稱Profile-guided optimization (PGO),也是一項(xiàng)新的優(yōu)化技術(shù),通常提升3%-4%,簡(jiǎn)單說(shuō)就是先跑一遍程序生成pprof文件,然后基于此文件引導(dǎo)編譯器優(yōu)化再編譯一遍。當(dāng)前只實(shí)現(xiàn)內(nèi)聯(lián)的優(yōu)化,后續(xù)可能增加多種優(yōu)化,個(gè)人理解有點(diǎn)類似離線版本JIT。
發(fā)行體積
安裝包安裝,$GOROOT/pkg 目錄將不再存儲(chǔ)標(biāo)準(zhǔn)庫(kù)的預(yù)編譯包存檔,相比之前減少1/3。
默認(rèn)禁用 CGO
在沒有C toolchain的系統(tǒng)上默認(rèn)禁用 CGO,相比依賴CGO的標(biāo)準(zhǔn)庫(kù),此情況編譯只依賴pure Go。
代碼編寫
可以看到,Go新版本代碼編寫演進(jìn)總的原則就是簡(jiǎn)化寫代碼的心智負(fù)擔(dān),普通開發(fā)者只需要關(guān)心實(shí)現(xiàn)即可,盡可能少的和底層實(shí)現(xiàn)綁定。
多error wrap
在1.13基礎(chǔ)上,增加多error wrap的能力,類似功能不用再依賴外部庫(kù)(hashicorp/go-multierror庫(kù)等)。
使用很簡(jiǎn)單,如下,多個(gè)%w格式化即可wrap,同時(shí)支持Is和As
func TestMultiWrap(t *testing.T) {err1 := errors.New("Error 1")err2 := errors.New("Error 2")err3 := errors.New("Error 3")err := fmt.Errorf("%w,%w,%w", err1, err2, err3)fmt.Printf("wrap errors:%v\n", err)fmt.Printf("is err1:%v, is err2:%v, is err3:%v\n",errors.Is(err, err1),errors.Is(err, err2),errors.Is(err, err3))
}
輸出
wrap errors:Error 1,Error 2,Error 3
is err1:true, is err2:true, is err3:true
slice轉(zhuǎn)array
在1.20之前,slice轉(zhuǎn)array需要了解底層原理,如下實(shí)現(xiàn),不是特別直觀
slice := []int{1, 2, 3, 4, 5}// 老方法array1 := *(*[5]int)(slice)
1.20引入直接轉(zhuǎn)換實(shí)現(xiàn),降低新手入門難度,更加直觀,如下操作即可
//新方法// 1.20之前報(bào)錯(cuò) cannot convert slice (variable of type []int) to type [5]intarray2 := [5]int(slice)//array22 := [6]int(slice)//fmt.Printf("Array:%v\n", array22)
注意目標(biāo)數(shù)組長(zhǎng)度不能大于slice長(zhǎng)度,否則報(bào)錯(cuò)
// panic: runtime error: cannot convert slice with length 5 to array or pointer to array with length 6
bytes string互轉(zhuǎn)
在1.20之前,bytes/string互轉(zhuǎn)需要了解底層實(shí)現(xiàn),借助unsafe代碼來(lái)實(shí)現(xiàn)如下
func OldBytesToString(b []byte) string {return *((*string)(unsafe.Pointer(&b)))
}func OldStringToBytes(s string) []byte {stringHeader := (*reflect.StringHeader)(unsafe.Pointer(&s))var b []bytepbytes := (*reflect.SliceHeader)(unsafe.Pointer(&b)) // 先引用,防止原有string gcpbytes.Data = stringHeader.Datapbytes.Len = stringHeader.Lenpbytes.Cap = stringHeader.Lenreturn b
}
1.20中,官方提供如下三個(gè)函數(shù)包裝下底層實(shí)現(xiàn)
- func String(ptr *byte, len IntegerType) string:根據(jù)數(shù)據(jù)指針和字符長(zhǎng)度構(gòu)造一個(gè)新的 string。
- func StringData(str string) *byte:返回指向該 string 的字節(jié)數(shù)組的數(shù)據(jù)指針。
- func SliceData(slice []ArbitraryType) *ArbitraryType:返回該 slice 的數(shù)據(jù)指針。
以往常用的 reflect.SliceHeader 和 reflect.StringHeader 將會(huì)被標(biāo)注為被廢棄。
互轉(zhuǎn)代碼大大簡(jiǎn)化,可如下實(shí)現(xiàn)
func NewBytesToString(b []byte) string {return unsafe.String(&b[0], len(b))
}func NewStringToBytes(s string) []byte {return unsafe.Slice(unsafe.StringData(s), len(s))
}
時(shí)間格式化和比較
在1.20之前,時(shí)間格式化只能用別扭的2006-01-02 15:04:05語(yǔ)法,可能創(chuàng)始人覺得Geek吧,扛不住剛需,現(xiàn)在終于支持常見的如下三種格式化語(yǔ)法,不知道啥時(shí)候能把YYmmdd加進(jìn)來(lái)
func TestTimeFormat(t *testing.T) {tm1 := time.Now()fmt.Printf("DateTime-%v\nDateOnly-%v\nTimeOnly-%v\n",tm1.Format(time.DateTime),tm1.Format(time.DateOnly),tm1.Format(time.TimeOnly))
}
輸出
DateTime-2023-02-09 00:43:13
DateOnly-2023-02-09
TimeOnly-00:43:13
另外就是,相比之前的After/Before比較,新引入一個(gè)Compare方法,比較上更加直觀和方便
func TestTimeCompare(t *testing.T) {tm1 := time.Now()tm2 := time.Now()c := tm1.Compare(tm2)if c == -1 {fmt.Println("tm1 < tm2")} else if c == 0 {fmt.Println("tm1 = tm2")} else if c == 1 {fmt.Println("tm1 > tm2")}
}
參考
代碼 https://gitee.com/wenzhou1219/go-in-prod/tree/master/go_120_feature
- Go1.20 那些事:錯(cuò)誤處理優(yōu)化、編譯速度提高、PGO 提效等新特性,你知道多少?
- Go 1.20 is released! - The Go Programming Language
- What’s New in Go 1.20, Part I: Language Changes
- Exploring Go’s Profile-Guided Optimizations
- PGO 是啥,咋就讓 Go 更快更猛了?
- GopherCon 2022: Russ Cox - Compatibility: How Go Programs Keep Working: https://www.youtube.com/watch?v=v24wrd3RwGo