首頁 > 後端開發 > Golang > 主體

作為通道實現的 Python 風格生成器:過早閱讀

王林
發布: 2024-02-08 23:06:17
轉載
329 人瀏覽過

作为通道实现的 Python 风格生成器:过早阅读

php小編柚子帶來了一篇關於通道實現的Python風格生成器的文章。在這篇文章中,我們將介紹過早閱讀的概念,以及如何使用通道來實現Python風格的生成器。透過這種方式,我們可以在PHP中使用類似於Python中的生成器語法,提供更靈活和高效的程式設計體驗。無論你是PHP開發者還是對生成器感興趣的人,這篇文章都會為你提供有價值的知識和實用的技巧。讓我們一起來探索這個有趣的主題吧!

問題內容

我嘗試使用以下通道實作 Python 風格的生成器:

package main

import (
    "fmt"
)

type ContainerIterable[T any] struct {
    content []T
}

func NewContainerIterable[T any]() *ContainerIterable[T] {
    return &ContainerIterable[T]{content: make([]T, 0)}
}

func (c *ContainerIterable[T]) Iterate() chan T {
    ch := make(chan T)
    go func() {
        for _, v := range c.content {
            ch <- v
        }
        close(ch)
    }()
    return ch
}

func (c *ContainerIterable[T]) Add(e T) {
    c.content = append(c.content, e)
}

func main() {
    c := NewContainerIterable[int]()

    for i := 0; i < 5; i++ {
        c.Add(i)
    }

    r := make([]int, 0)
    for v := range c.Iterate() {
        r = append(r, v)
    }

    for i := 0; i < 5; i++ {
        fmt.Println(i, r[i], i == r[i])
    }
}
登入後複製

這工作得很好,輸出是

0 0 true
1 1 true
2 2 true
3 3 true
4 4 true
登入後複製

但是,當我改變

r := make([]int, 0)
登入後複製

r := make([]int, 5)
登入後複製
登入後複製

結果不同:

0 0 true
1 0 false
2 0 false
3 0 false
4 0 false
登入後複製

我知道在第二種情況下 c.Iterate() 之前開始從通道讀取

go func() {
        for _, v := range c.content {
            ch <- v
        }
登入後複製

有機會向頻道發送任何內容。 這不適用於第一種情況,因為當呼叫 append() 時,main() goroutine 需要一些時間來為 r 切片重新分配空間。

請告知如何調整我的程式碼以使 Iterate() 正常運作?

解決方法

這個:

r := make([]int, 5)
登入後複製
登入後複製

將初始化一個包含 5 個元素的切片,全部為 0。然後您將再向其中添加 5 個元素。您的程式正在讀取前 5 個零元素。

使用:r:=make([]int,0,5)

以上是作為通道實現的 Python 風格生成器:過早閱讀的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!