Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Penjana gaya Python dilaksanakan sebagai saluran: membaca terlalu awal

Penjana gaya Python dilaksanakan sebagai saluran: membaca terlalu awal

王林
王林ke hadapan
2024-02-08 23:06:17334semak imbas

作为通道实现的 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])
    }
}

Ini berfungsi hebat, outputnya adalah

0 0 true
1 1 true
2 2 true
3 3 true
4 4 true

Tapi bila dah berubah

r := make([]int, 0)

kepada

r := make([]int, 5)

Hasilnya berbeza:

0 0 true
1 0 false
2 0 false
3 0 false
4 0 false

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

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

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)

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam