最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶大家搞懂Go語(yǔ)言中的迭代器

 更新時(shí)間:2025年02月10日 08:58:11   作者:木卯  
迭代器是使用戶可在容器對(duì)象上遍訪的對(duì)象,設(shè)計(jì)人員使用此接口無(wú)需關(guān)心容器對(duì)象的內(nèi)存分配的實(shí)現(xiàn)細(xì)節(jié),本文主要為大家詳細(xì)介紹一下Go語(yǔ)言中的迭代器的實(shí)現(xiàn),需要的可以了解下

1. 迭代器簡(jiǎn)介

1.1 定義

維基百科上迭代器的定義:迭代器(英語(yǔ):iterator),是使用戶可在容器對(duì)象(container,例如鏈表或數(shù)組)上遍訪的對(duì)象,設(shè)計(jì)人員使用此接口無(wú)需關(guān)心容器對(duì)象的內(nèi)存分配的實(shí)現(xiàn)細(xì)節(jié)。

1.2 為何需要迭代器

理論上,迭代器的功能可以通過(guò)其他方法實(shí)現(xiàn),那為何還需要迭代器呢?迭代器之所以存在,自然是有它的優(yōu)點(diǎn)的:

  • 節(jié)省內(nèi)存: 迭代器不會(huì)一次性將所有數(shù)據(jù)都加載到內(nèi)存中,而是按需生成數(shù)據(jù)。比如在逐行讀取大文件時(shí)使用迭代器能顯著減少內(nèi)存的使用。
  • 性能優(yōu)化:迭代器僅在需要時(shí)生成數(shù)據(jù),可以減少不必要的計(jì)算。比如,數(shù)據(jù)庫(kù)查詢結(jié)果集逐行返回,而不是一次性返回所有記錄。
  • 解耦數(shù)據(jù)生成邏輯與遍歷邏輯:迭代器負(fù)責(zé)生成數(shù)據(jù),其邏輯是獨(dú)立的,不受遍歷數(shù)據(jù)邏輯的影響。同樣的 ,遍歷迭代器時(shí)無(wú)需考慮數(shù)據(jù)生成的細(xì)節(jié)。

2. Go 1.23版本之前的迭代器

在 1.23 版本之前,Go 官方是沒(méi)有提供傳統(tǒng)意義上的迭代器的,如果要用到迭代器的功能,就需要自己實(shí)現(xiàn)。下面來(lái)說(shuō)說(shuō)兩種比較有代表性的實(shí)現(xiàn)。

面向?qū)ο笳Z(yǔ)言的迭代器

在面向?qū)ο笳Z(yǔ)言中,Java 中的 Iterator 迭代器是比較有代表性的,下面使用 Go 來(lái)實(shí)現(xiàn)一個(gè)類(lèi)似的迭代器。

package main  
  
import "fmt"  
  
type Iterator struct {  
    data  []int  
    index int  
}  
  
func NewIterator(data []int) *Iterator {  
    return &Iterator{data: data, index: 0}  
}  
  
func (it *Iterator) HasNext() bool {  
    return it.index < len(it.data)  
}  
  
func (it *Iterator) Next() int {  
    if it.index >= len(it.data) {  
       panic("沒(méi)有元素了")  
    }  
    item := it.data[it.index]  
    it.index++  
    return item  
}  
  
func main() {  
    it := NewIterator([]int{1, 2, 3, 4, 5})  
    for it.HasNext() {  
       fmt.Println(it.Next())  
    }  
}

這種面向?qū)ο髮?shí)現(xiàn)的迭代器不夠簡(jiǎn)潔,一般而言,在實(shí)際編程中很少自定義這樣的迭代器。

函數(shù)形式的迭代器

Go 中使用函數(shù)形式實(shí)現(xiàn)的迭代器,比較有代表性的是使用協(xié)程和通道來(lái)實(shí)現(xiàn)的:

package main  
  
import "fmt"  
  
func generator(num int) <-chan int {  
    ch := make(chan int)  
    go func() {  
       for i := 0; i < num; i++ {  
          ch <- i  
       }  
       close(ch)  
    }()  
    return ch  
}  
  
func main() {  
    for n := range generator(5) {  
       fmt.Println(n)  
    }  
}

這種形式的迭代器,相對(duì)面向?qū)ο蟮牡饕?jiǎn)潔得多。不過(guò)該方式使用了協(xié)程來(lái)實(shí)現(xiàn),其性能要差很多。

3. Go 1.23版本的迭代器

Go 1.23 版本提供了一個(gè) iter 包,算是 Go 官方提供了一個(gè)標(biāo)準(zhǔn)的迭代器實(shí)現(xiàn)。

Go 1.23 的迭代器是一個(gè)函數(shù)類(lèi)型,把另一個(gè)函數(shù)( yield 函數(shù))作為參數(shù),定義迭代器時(shí)將元素傳遞給 yield 函數(shù)。迭代器函數(shù)會(huì)在以下兩種情況停止。

  • 在序列迭代結(jié)束后停止,表示此次迭代結(jié)束。
  • 在 yield 函數(shù)返回 false 時(shí)停止,表示提前停止迭代。

下面使用 iter 包來(lái)實(shí)現(xiàn)函數(shù)形式的迭代器,iter.Seq[V any]func(yield func(V) bool) 的簡(jiǎn)稱:

package main  
  
import (  
    "fmt"  
    "iter")  
  
func generator(num int) iter.Seq[int] {  
    return func(yield func(int) bool) {  
       for i := 0; i < num; i++ {  
          if !yield(i) {  
             return  
          }  
       }  
    }  
}  
  
func main() {  
    for n := range generator(5) {  
       fmt.Println(n)  
    }  
}

這種形式的迭代器,兼顧了性能和簡(jiǎn)潔性。

在性能方面,筆者測(cè)試了一下,使用 yield函數(shù) 實(shí)現(xiàn)的迭代器,比使用協(xié)程和通道實(shí)現(xiàn)的迭代器,提升了 200 多倍的性能!

簡(jiǎn)潔性是相對(duì)面向?qū)ο髞?lái)說(shuō)的。有些遺憾的是,相比其他的一些語(yǔ)言,上面的實(shí)現(xiàn)在簡(jiǎn)潔明了方面做得不夠好。generator 需要返回一個(gè)函數(shù),該函數(shù)的參數(shù)還是一個(gè)函數(shù),還需要判斷是否提前停止迭代。這樣很不優(yōu)雅,本來(lái)這些是需要隱藏到幕后,由語(yǔ)言本身實(shí)現(xiàn)而不是由用戶去實(shí)現(xiàn)的。

其他語(yǔ)言中一個(gè)比較優(yōu)雅的迭代器實(shí)現(xiàn)方式是 Python 的生成器函數(shù),其方式如下:

def generator(num: int):  
    for i in range(num):  
        yield i

上面的代碼僅用3行就實(shí)現(xiàn)了同樣的功能,而且該函數(shù)里面無(wú)需返回函數(shù),無(wú)需判斷是否需要提前停止迭代。用戶只需關(guān)注如何生成數(shù)據(jù),然后通過(guò)一個(gè) yield 語(yǔ)句就可將數(shù)據(jù)傳給遍歷者。

4. 總結(jié)

Go 1.23版本之前,Go 官方?jīng)]有提供迭代器,需要用戶自己定義,很不方便。Go 1.23 開(kāi)始,終于提供了官方的迭代器,彌補(bǔ)了 Go 語(yǔ)言在迭代器方面的缺失,方便了有相關(guān)需求的用戶,這是可喜的。

Go 語(yǔ)言追求簡(jiǎn)單,少即是多的理念,這本無(wú)可厚非,不過(guò)之前的 Go 追求得有些極端了。近年來(lái),Go 終于沒(méi)那么極端了,為 Go 語(yǔ)言本身和 Go 標(biāo)準(zhǔn)庫(kù) 添加了許多特性和功能。望 Go 早日成為主流編程語(yǔ)言。

到此這篇關(guān)于一文帶大家搞懂Go語(yǔ)言中的迭代器的文章就介紹到這了,更多相關(guān)Go語(yǔ)言迭代器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用go讀取gzip格式的壓縮包的操作

    使用go讀取gzip格式的壓縮包的操作

    這篇文章主要介紹了使用go讀取gzip格式的壓縮包的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Go官方限流器的用法詳解

    Go官方限流器的用法詳解

    限流器是提升服務(wù)穩(wěn)定性的非常重要的組件,本文主要介紹了Go官方限流器的用法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Golang語(yǔ)言如何避免空指針引發(fā)的panic詳解

    Golang語(yǔ)言如何避免空指針引發(fā)的panic詳解

    簡(jiǎn)單地說(shuō)go語(yǔ)言的指針類(lèi)型和C/C++的指針類(lèi)型用法是一樣的,除了出去安全性的考慮,go語(yǔ)言增加了一些限制,這篇文章主要給大家介紹了關(guān)于Golang語(yǔ)言如何避免空指針引發(fā)panic的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • golang?pprof監(jiān)控memory?block?mutex使用指南

    golang?pprof監(jiān)控memory?block?mutex使用指南

    這篇文章主要為大家介紹了golang?pprof監(jiān)控memory?block?mutex使用指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Go語(yǔ)言kylin任務(wù)自動(dòng)化實(shí)例詳解

    Go語(yǔ)言kylin任務(wù)自動(dòng)化實(shí)例詳解

    這篇文章主要為大家介紹了Go語(yǔ)言kylin任務(wù)自動(dòng)化實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • GO語(yǔ)言實(shí)現(xiàn)標(biāo)題閃爍效果

    GO語(yǔ)言實(shí)現(xiàn)標(biāo)題閃爍效果

    這篇文章主要介紹了GO語(yǔ)言實(shí)現(xiàn)標(biāo)題閃爍效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 一文了解Go語(yǔ)言中編碼規(guī)范的使用

    一文了解Go語(yǔ)言中編碼規(guī)范的使用

    這篇文章主要介紹了一文了解Go語(yǔ)言中編碼規(guī)范的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Go語(yǔ)言在終端打開(kāi)實(shí)現(xiàn)進(jìn)度條處理數(shù)據(jù)方法實(shí)例

    Go語(yǔ)言在終端打開(kāi)實(shí)現(xiàn)進(jìn)度條處理數(shù)據(jù)方法實(shí)例

    這篇文章主要介紹了Go語(yǔ)言在終端打開(kāi)實(shí)現(xiàn)進(jìn)度條處理數(shù)據(jù)方法實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 使用Go語(yǔ)言編寫(xiě)一個(gè)簡(jiǎn)單的Web框架

    使用Go語(yǔ)言編寫(xiě)一個(gè)簡(jiǎn)單的Web框架

    Go語(yǔ)言(又稱Golang)因其高效的性能和簡(jiǎn)潔的語(yǔ)法,在編寫(xiě)Web框架方面表現(xiàn)出色,下面將詳細(xì)介紹如何使用Go語(yǔ)言編寫(xiě)一個(gè)簡(jiǎn)單的Web框架,文中有詳細(xì)的代碼供大家參考,需要的朋友可以參考下
    2024-05-05
  • Go標(biāo)準(zhǔn)容器之Ring的使用說(shuō)明

    Go標(biāo)準(zhǔn)容器之Ring的使用說(shuō)明

    這篇文章主要介紹了Go標(biāo)準(zhǔn)容器之Ring的使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05

最新評(píng)論

安阳县| 永福县| 中江县| 临夏县| 砀山县| 阜新市| 乡宁县| 商城县| 阜新市| 东乡族自治县| 浠水县| 东山县| 乡城县| 民权县| 财经| 信宜市| 七台河市| 红桥区| 垦利县| 临江市| 临武县| 环江| 普宁市| 高尔夫| 原平市| 会昌县| 平乡县| 北票市| 东辽县| 达拉特旗| 隆尧县| 浮梁县| 长乐市| 淮阳县| 天津市| 南部县| 武夷山市| 永寿县| 桂平市| 苏尼特左旗| 淄博市|