猿问

已收到符文,但未从 chan 收到结构

我遇到了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;

}

它也可以完美地工作。但是,如果我试图将它们组合在一起,我遇到了一个问题。我有两个代码片段要显示。enumRunes(iterRunes(pattern))


第一个是:


    tmp := enumRunes(iterRunes(pattern))

    z := <-tmp;

    for z.int < utf8.RuneCountInString(pattern) {

        fmt.Println("z = <- tmp;")

        fmt.Println(z)

        z = <- tmp;

    }

它的输出是这样的:


...

z = <- tmp;

{0 0}

{0 0}

z = <- tmp;

{0 0}

{0 0}

z = <- tmp;

{0 0}

{0 0}

z = <- tmp;

...

这里是结构类型。因此,我进入了无限循环,因为结构由于某种原因没有更新。第二个片段:z


    tmp := iterRunes(pattern)

    z := <-tmp;

    for qq := 0; qq < utf8.RuneCountInString(pattern); qq++ {

        fmt.Println("z = <- tmp;")

        fmt.Println(z)

        z = <- tmp;

    }

这是符文类型,它工作正常。问题是为什么第一个代码段中没有更新。提前感谢您。zz


holdtom
浏览 107回答 1
1回答

元芳怎么了

我希望你知道(参考)来自闭合通道的接收立即返回零值有了这个,让我们看看你的问题!z.int < utf8.RuneCountInString(pattern)在这里,只要 z.int 小于字符串的符文计数,即使该值是默认的0,也始终满足这一点。在此上下文中,您现在可以看到,即使通道已关闭,由于您正在从中读取,它将返回一个空的 .哪个集合和循环继续到无穷大。{0, 0} structz.int to 0
随时随地看视频慕课网APP

相关分类

Go
我要回答