已收到符文,但未收到来自 chan 的结构
Rune is received but struct is not received from 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
是struct类型。所以,我进入了一个无限循环,因为结构由于某种原因没有更新。
第二个片段:
tmp := iterRunes(pattern)
z := <-tmp;
for qq := 0; qq < utf8.RuneCountInString(pattern); qq++ {
fmt.Println("z = <- tmp;")
fmt.Println(z)
z = <- tmp;
}
这里z
是符文类型的,它工作正常。
问题是为什么第一个片段中的 z
没有更新。
提前谢谢你。
我希望你知道 (ref)
A receive from a closed channel returns the zero value immediately
说到这里,我们来看看你的问题吧!
z.int < utf8.RuneCountInString(pattern)
只要 z.int 小于字符串的符文计数,这里就始终满足,即使该值是默认值 0。
有了这个上下文,您现在可以看到,即使通道已关闭,由于您正在从中读取,它也会 return 一个空的 {0, 0} struct
。它设置 z.int to 0
并且循环继续到无穷大。
我遇到了 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
是struct类型。所以,我进入了一个无限循环,因为结构由于某种原因没有更新。
第二个片段:
tmp := iterRunes(pattern)
z := <-tmp;
for qq := 0; qq < utf8.RuneCountInString(pattern); qq++ {
fmt.Println("z = <- tmp;")
fmt.Println(z)
z = <- tmp;
}
这里z
是符文类型的,它工作正常。
问题是为什么第一个片段中的 z
没有更新。
提前谢谢你。
我希望你知道 (ref)
A receive from a closed channel returns the zero value immediately
说到这里,我们来看看你的问题吧!
z.int < utf8.RuneCountInString(pattern)
只要 z.int 小于字符串的符文计数,这里就始终满足,即使该值是默认值 0。
有了这个上下文,您现在可以看到,即使通道已关闭,由于您正在从中读取,它也会 return 一个空的 {0, 0} struct
。它设置 z.int to 0
并且循环继续到无穷大。