我正在尝试用Go语言编写wc(1),并且尝试使用goroutines来更有效地计算大量输入文件。我的代码运行得很好,但是我很难实现一个方法来总结所有go例程的统计数据。如何将函数变量nl
,nw
,nc
传递给main,并在所有go例程完成工作后在那里汇总它们?
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
ch := make(chan string)
for _, arg := range os.Args[1:] {
go wc(arg, ch)
}
for range os.Args[1:] {
fmt.Println(<-ch)
}
// Todo: summarize results...
}
func wc(arg string, ch chan<- string) {
nl, nw, nc := 0, 0, 0
file, err := os.Open(arg)
if err != nil {
fmt.Println("Can't open file: %v", err)
}
defer file.Close()
scan := bufio.NewScanner(file)
for scan.Scan() {
nl++
line := scan.Text()
words := bufio.NewScanner(strings.NewReader(line))
words.Split(bufio.ScanWords)
for words.Scan() {
nw++
}
runes := bufio.NewReader(strings.NewReader(line))
for {
if _, _, err := runes.ReadRune(); err != nil {
break
} else {
nc++
}
}
}
ch <- fmt.Sprintf("%8d%8d%8d", nl, nw, nc+nl)
}
2条答案
按热度按时间vmjh9lq91#
你已经接近答案了!我建议快速地返回一个带有数字的
Result
对象,这样可以很容易地在末尾添加数字(而不是使用字符串)。因此,您可以使用chan Result
而不是chan string
。基本上,您可以引入一个
totalResult
变量,当迭代所有结果时,只需将nl
、nc
和nw
的结果添加到该total变量中。你应该得到这样的东西(有3个文件):
qoefvg9y2#
答案非常简单,并不特定于Go或goroutines:当你需要将多个值作为一个单位传递时,使用compound data type。
在Go的情况下,在您的特定情况下,最简单的方法是声明
struct
类型,并使您的通道传输此类型的值。类型可能如下所示: