Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 收到符文,但未收到来自chan的结构_Loops_Go_Channel_Rune - Fatal编程技术网

Loops 收到符文,但未收到来自chan的结构

Loops 收到符文,但未收到来自chan的结构,loops,go,channel,rune,Loops,Go,Channel,Rune,我遇到了golang 1.16的奇怪行为。对于我的一个项目,我需要迭代字符串中的符文。因此,我创建了一个简单的迭代器,如下所示: func iterRunes(s string) <-chan rune { runes := make(chan rune); go func() { defer close(runes); for _, char := range s { runes <- char;

我遇到了golang 1.16的奇怪行为。对于我的一个项目,我需要迭代字符串中的符文。因此,我创建了一个简单的迭代器,如下所示:

func iterRunes(s string) <-chan rune {
    runes := make(chan rune);
    go func() {
        defer close(runes);
        for _, char := range s {
            runes <- char;
        }
    } ()
    return runes;
}
func enumRunes(runes <-chan rune) <-chan struct {int; rune} {
    eRunes := make(chan struct {int; rune});
    go func() {
        defer close(eRunes);
        i := 0;
        for r := range runes {
            eRunes <- struct {int; rune} {i, r};
            i++;
        }
    } ()
    return eRunes;
}
其输出如下:

...
z = <- tmp;
{0 0}
{0 0}
z = <- tmp;
{0 0}
{0 0}
z = <- tmp;
{0 0}
{0 0}
z = <- tmp;
...
这里的z是符文类型的,它工作得很好。 问题是为什么第一个代码段中的z没有更新。 提前谢谢你。

我希望你知道这一点

来自封闭通道的接收立即返回零值

有了这些,让我们来看看你的问题

z、 int 在这里,只要z.int小于字符串的符文计数,即使该值是默认值0,也可以满足这一要求


在这个上下文中,您现在可以看到,即使通道已关闭,由于您正在从中读取,它仍将返回空的{0,0}结构。将z.int设置为0,循环将继续无穷大。

进入工作状态!对于破损的情况!非常感谢,这是我愚蠢的过错。下次我会检查两次文件。
...
z = <- tmp;
{0 0}
{0 0}
z = <- tmp;
{0 0}
{0 0}
z = <- tmp;
{0 0}
{0 0}
z = <- tmp;
...
    tmp := iterRunes(pattern)
    z := <-tmp;
    for qq := 0; qq < utf8.RuneCountInString(pattern); qq++ {
        fmt.Println("z = <- tmp;")
        fmt.Println(z)
        z = <- tmp;
    }