我try 使用this之后的通道来实现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
        }

has a chance 至 send anything 至 channel. This does not apply 至 the first case since main() goroutine takes some time 至 reallocate space for r slice when append() is invoked.

Please advise how 至 adjust my code 至 make Iterate() work properly?

推荐答案

这一点:

r := make([]int, 5)

将初始化一个包含5个元素(均为0)的切片.然后再添加5个元素.您的程序正在读取前5个零元素.

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

Go相关问答推荐

Makefile:现有文件上没有这样的文件或目录,不加载环境变量

golang.org/x/oauth2 oauth2.Config.Endpoint.TokenURL mock:缺少access_token

如何使用中间件更改http请求的响应代码?

在nixos上找不到XInput2.h头文件的包

正确使用pgtype的方法

显示GUI时后台处理功能

如何找到一个空闲的TPM句柄来保存新的密钥对对象?

Go 中带有回调的 MiniDumpWriteDump

如何使用 html/template 在 golang 中运行一个范围内的范围

这种合并排序的实现有什么问题?

无法在go中为docker容器写入有效的挂载路径

htmx 表单 + gin 无法正确读取请求正文

有没有办法在 Golang 中使用带有 go-simple-mail lib 的代理?

一个Go module可以和之前的非module模块发布在同一个路径下吗?

我如何使用 TOML fixtures 在使用 Go Buffalo 框架的开发环境中为我的数据库 seeder ?

Gorm 在保存/创建时序列化 struct

Golang 数据库/sql 与 SetMaxOpenConns 挂起

如何使路径/不匹配 Golang net/http 中所有其他不匹配的路径

函数参数的判断顺序是什么?

为什么 Go 不允许将一个泛型分配给另一个泛型?