我大概想写一个按行读取文件送到channel里,另一个从channel中取出处理的程序。遇到了一些问题:
- reader按行读取,等读完了用
ok <- nil通知,这里我就觉得很不优雅,两个channel都是作为参数传进来的,没有用上返回值。我不知道怎么修改。 - 输出还没输出完,程序就结束了。但是从len(ch)又可以看到ch是消费完了的。怎么办?
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
err := program()
if err != nil {
panic(err)
}
}
func program() error {
f, err := os.Open("data.txt")
if err != nil {
return err
}
defer f.Close()
scanner := bufio.NewScanner(f)
ch := make(chan string, 3)
ok := make(chan any)
ok2 := make(chan any)
go reader(scanner, ch, ok)
go outputer(ch, ok2)
<-ok
if err := scanner.Err(); err != nil {
return err
}
close(ch)
<-ok2
fmt.Println(len(ch))
fmt.Println("完成")
return nil
}
func reader(scanner *bufio.Scanner, data chan string, ok chan any) {
for scanner.Scan() {
data <- scanner.Text()
}
ok <- nil
}
func outputer(data chan string, ok chan any) {
for s := range data {
go func(s string) {
fmt.Println(s)
}(s)
}
ok <- nil
}
3.没办法调试。我用的是VSCode,会报错invalid command

4.程序的所有方面的结构,如果各位有改进建议,还请不吝赐教。