Penjana gaya Python dilaksanakan sebagai saluran: membaca terlalu awal

王林
Lepaskan: 2024-02-08 23:06:17
ke hadapan
329 orang telah melayarinya

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

editor php Youzi membawa artikel tentang penjana gaya Python untuk pelaksanaan saluran. Dalam siaran ini, kami akan memperkenalkan konsep bacaan pramatang dan cara menggunakan saluran untuk melaksanakan penjana gaya Python. Dengan cara ini, kami boleh menggunakan sintaks penjana dalam PHP sama seperti dalam Python, memberikan pengalaman pengaturcaraan yang lebih fleksibel dan cekap. Sama ada anda seorang pembangun PHP atau seseorang yang berminat dengan penjana, artikel ini akan memberikan anda pengetahuan yang berharga dan petua praktikal. Mari kita terokai topik menarik ini bersama-sama!

Kandungan soalan

Saya cuba melaksanakan penjana gaya Python menggunakan saluran berikut:

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])
    }
}
Salin selepas log masuk

Ini berfungsi hebat, outputnya adalah

0 0 true
1 1 true
2 2 true
3 3 true
4 4 true
Salin selepas log masuk

Tapi bila dah berubah

r := make([]int, 0)
Salin selepas log masuk

kepada

r := make([]int, 5)
Salin selepas log masuk
Salin selepas log masuk

Hasilnya berbeza:

0 0 true
1 0 false
2 0 false
3 0 false
4 0 false
Salin selepas log masuk

Saya tahu bahawa dalam kes kedua c.Iterate() mula membaca dari saluran sebelum ini

go func() {
        for _, v := range c.content {
            ch <- v
        }
Salin selepas log masuk

Peluang untuk menghantar sebarang kandungan ke saluran. Ini tidak berfungsi dalam kes pertama kerana apabila append() 时,main() goroutine 需要一些时间来为 r dipanggil hirisan memperuntukkan semula ruang.

Sila maklumkan bagaimana saya boleh melaraskan kod saya untuk menjadikan Iterate() berfungsi dengan betul?

Penyelesaian

Ini:

r := make([]int, 5)
Salin selepas log masuk
Salin selepas log masuk

akan memulakan kepingan yang mengandungi 5 elemen, semuanya 0. Anda kemudian akan menambah 5 lagi elemen padanya. Program anda sedang membaca 5 elemen sifar pertama.

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

Atas ialah kandungan terperinci Penjana gaya Python dilaksanakan sebagai saluran: membaca terlalu awal. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!