【问题标题】:Rune is received but struct is not received from chan已收到符文,但未从 chan 收到 struct
【发布时间】:2021-06-17 21:43:22
【问题描述】:

我遇到了 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)) 那样组合它们,我会遇到问题。我有两个代码 sn-p 要显示。

第一个是:

    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 是结构类型。所以,我进入了一个无限循环,因为结构由于某种原因没有更新。 还有第二个sn-p:

    tmp := iterRunes(pattern)
    z := <-tmp;
    for qq := 0; qq < utf8.RuneCountInString(pattern); qq++ {
        fmt.Println("z = <- tmp;")
        fmt.Println(z)
        z = <- tmp;
    }

这里的z 是rune 类型,它工作正常。 问题是为什么第一个 sn-p 中的z 没有更新。 提前谢谢你。

【问题讨论】:

标签: loops go channel rune


【解决方案1】:

希望你知道 (ref)

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

有了这个,让我们看看你的问题!

z.int &lt; utf8.RuneCountInString(pattern)

只要 z.int 小于字符串的符文计数,这将始终满足,即使该值是默认值 0。

有了这个上下文,您现在可以看到即使通道已关闭,由于您正在从中读取,它会返回一个空的{0, 0} struct。设置z.int to 0 并且循环继续到无穷大。

【讨论】:

  • 非常感谢,这是我愚蠢的错。下次会检查文档两次。
猜你喜欢
  • 2018-07-09
  • 1970-01-01
  • 1970-01-01
  • 2020-10-12
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
  • 2017-05-28
  • 2015-09-11
相关资源
最近更新 更多