最近 Go1.23 進(jìn)入了凍結(jié)階段,意味著不再添加新功能,而且已經(jīng)加入的功能也不再會(huì)刪除。
Go 1.23 正式引入了 iter 軟件包,這是一個(gè)專門用于 Iterators 的新特性。
該軟件包在 Go 1.22 中作為實(shí)驗(yàn)性功能,需要通過(guò) GOEXPERIMENT=rangefunc 參數(shù)啟用。
在 Go 1.23 中,開發(fā)者可以直接通過(guò)代碼實(shí)現(xiàn)迭代。
在這之前循環(huán)將切片數(shù)據(jù)全部轉(zhuǎn)換為大寫時(shí)的寫法:
func Convert[S any, D any](src []S, mapFn func(s S) D) []D { r := make([]D, 0, len(src)) for _, i := range src { r = append(r, mapFn(i)) } return r } func ToUpByString() { sl := []string{"hello", "world", "golang"} s0 := Convert(sl, func(v string) string { return strings.ToUpper(v) }) for _, v := range s0 { // do business } }而在使用新的 Iter 迭代器之后:
func Backward(s []string) func(yield func(string) bool) { return func(yield func(string) bool) { for i := len(s) - 1; i >= 0; i-- { yield(strings.ToUpper(s[i])) } } } func ToUpperByIter() { sl := []string{"hello", "world", "golang"} for v := range Backward(sl) { // do business } }可以發(fā)現(xiàn)明顯的代碼量減少了,同時(shí)更符合函數(shù)式編程的特性。
通過(guò)性能比較,ToUpperByIter 方法性能更高,因?yàn)樗恍枰匦路峙湫碌那衅?span style="display:none">KvJ28資訊網(wǎng)——每日最新資訊28at.com
? huizhou92 git:(master) ? go test -bench . -count=3 goos: darwin goarch: arm64 pkg: huizhou92 cpu: Apple M1 Pro BenchmarkToUpByString-10 8568332 128.7 ns/op BenchmarkToUpByString-10 9310351 128.6 ns/op BenchmarkToUpByString-10 9344986 128.5 ns/op BenchmarkToUpByIter-10 12440120 96.22 ns/op BenchmarkToUpByIter-10 12436645 96.25 ns/op BenchmarkToUpByIter-10 12371175 96.64 ns/op PASS ok huizhou92 8.162siter 軟件包提供了兩種迭代器類型:
具體函數(shù)聲明如下:
// Seq is an iterator over sequences of individual values. // When called as seq(yield), seq calls yield(v) for each value v in the sequence, // stopping early if yield returns false. type Seq[V any] func(yield func(V) bool) // Seq2 is an iterator over sequences of pairs of values, most commonly key-value pairs. // When called as seq(yield), seq calls yield(k, v) for each pair (k, v) in the sequence, // stopping early if yield returns false. type Seq2[K, V any] func(yield func(K, V) bool)iter 軟件包的目標(biāo)是提供一種統(tǒng)一和高效的迭代方法,并且已經(jīng)在 map 包中添加了 All 和 Keys 等方法。
具體列表如下:
圖片
圖片
而社區(qū)對(duì)于 yield 和 iter 的引入有不同意見,有人認(rèn)為它會(huì)引入復(fù)雜性和難以可理解的代碼,而另一些則認(rèn)為它能夠幫助開發(fā)者簡(jiǎn)化代碼并采用更多函數(shù)式編程。
個(gè)人覺得 Go 在新版本映入一些新特性是有必要的,這樣才能保持社區(qū)的活躍,同時(shí)選擇權(quán)也是交給開發(fā)者的。
類似的在 Java8 中引入的 lambda 表達(dá)式起初也是有很多人反饋難以閱讀與調(diào)試,經(jīng)過(guò)這么多年的普及以及 IDE 的支持,現(xiàn)在已經(jīng)成為大多數(shù)開發(fā)者的標(biāo)配了。
參考鏈接:
本文鏈接:http://m.www897cc.com/showinfo-26-95916-0.htmlGo 1.23:擁抱iter包,簡(jiǎn)化你的迭代邏輯
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com
上一篇: 電商系統(tǒng)開發(fā)所遇問(wèn)題及C#實(shí)例解析
下一篇: C++多線程中的互斥鎖