为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
holdtom 2022-08-15 19:47:32
我遇到了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
查看完整描述

1 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

我希望你知道(参考)

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

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

z.int < utf8.RuneCountInString(pattern)

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

在此上下文中,您现在可以看到,即使通道已关闭,由于您正在从中读取,它将返回一个空的 .哪个集合和循环继续到无穷大。{0, 0} structz.int to 0


查看完整回答
反对 回复 2022-08-15
  • 1 回答
  • 0 关注
  • 106 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信