首頁 > 後端開發 > Golang > 在 Go 中建立迭代器的最佳方法是什麼:通道、閉包或命名類型?

在 Go 中建立迭代器的最佳方法是什麼:通道、閉包或命名類型?

Patricia Arquette
發布: 2024-12-07 10:29:15
原創
755 人瀏覽過

What's the Best Way to Create Iterators in Go: Channels, Closures, or Named Types?

在Go 中建立迭代器:通道、閉包與命名類型

在Go 中,存在多種建立迭代器的方法。一種流行的選擇是利用類似迭代器的通道。然而,通道受到限制,特別是作為推模型而不是拉模型,導致潛在的洩漏。

慣用的方法涉及使用閉包。以下範例示範如何建立用於產生偶數的迭代器:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

package main

 

import "fmt"

 

func main() {

    gen := newEven()

    fmt.Println(gen())

    fmt.Println(gen())

    fmt.Println(gen())

    gen = nil // release for garbage collection

}

 

func newEven() func() int {

    n := 0

    return func() int {

        n += 2

        return n

    }

}

登入後複製

另一個選項是將命名類型與方法一起使用:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

package main

 

import "fmt"

 

func main() {

    gen := even(0)

    fmt.Println(gen.next())

    fmt.Println(gen.next())

    fmt.Println(gen.next())

}

 

type even int

 

func (e *even) next() int {

    *e += 2

    return int(*e)

}

登入後複製

閉包和命名類型之間的選擇取決於特定需求。閉包提供了靈活性,而命名類型可以提供更結構化的方法。

此外,由於函數是一等對象,因此在 Go 中連結迭代器很簡單。以下範例將偶數產生器與平方函數連結起來:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

package main

 

import "fmt"

 

func main() {

    gen := mapInt(newEven(), square)

    fmt.Println(gen())

    fmt.Println(gen())

    fmt.Println(gen())

    gen = nil // release for garbage collection

}

 

type intGen func() int

 

func newEven() intGen {

    n := 0

    return func() int {

        n += 2

        return n

    }

}

 

func mapInt(g intGen, f func(int) int) intGen {

    return func() int {

        return f(g())

    }

}

 

func square(i int) int {

    return i * i

}

登入後複製

以上是在 Go 中建立迭代器的最佳方法是什麼:通道、閉包或命名類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板