input := "Spicy jalapeno pastrami ut ham turducken.\n Lorem sed ullamco, leberkas sint short loin strip steak ut shoulder shankle porchetta venison prosciutto turducken swine.\n Deserunt kevin frankfurter tongue aliqua incididunt tri-tip shank nostrud.\n"
scanner := bufio.NewScanner(strings.NewReader(input))
// Set the split function for the scanning operation.
scanner.Split(bufio.ScanWords)
// Count the words.
count := 0
for scanner.Scan() {
count++
}
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, "reading input:", err)
}
fmt.Printf("%d\n", count)
要计算行数:
input := "Spicy jalapeno pastrami ut ham turducken.\n Lorem sed ullamco, leberkas sint short loin strip steak ut shoulder shankle porchetta venison prosciutto turducken swine.\n Deserunt kevin frankfurter tongue aliqua incididunt tri-tip shank nostrud.\n"
scanner := bufio.NewScanner(strings.NewReader(input))
// Set the split function for the scanning operation.
scanner.Split(bufio.ScanLines)
// Count the lines.
count := 0
for scanner.Scan() {
count++
}
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, "reading input:", err)
}
fmt.Printf("%d\n", count)
4条答案
按热度按时间eni9jsuy1#
要计算单词数:
要计算行数:
6l7fqoea2#
这是Go语言练习7.1中的一个练习
这是@repler解决方案的扩展:
nzrxty8p3#
这是《Go语言》一书中的一个练习。练习7.1
这是我的解决方案:
8hhllhi24#
bufio.ScanWords
和bufio.ScanLines
(以及bufio.ScanBytes
和bufio.ScanRunes
)是 * 拆分函数 *:它们为bufio.Scanner
提供了将其输入数据标记化的策略-扫描过程应如何拆分数据。bufio.Scanner
的拆分函数默认为bufio.ScanLines
,但可以通过bufio.Scanner.Split
方法进行更改。这些拆分函数的类型为
SplitFunc
:通常,您不需要直接调用这些函数中的任何一个;但是,您可能需要创建自己的split函数来实现自定义标记化策略,因此,让我们看看它的参数:
data
:剩余数据尚未处理。atEOF
:调用方是否已经到达EOF,因此在下一次调用中没有更多的新数据要提供。advance
:字节数调用方必须为下一次调用推进输入数据。token
:作为执行拆分的结果返回给调用者的令牌。为了进一步理解,让我们来看一下
bufio.ScanBytes
的实现:只要
data
不为空,它就向调用者返回一个令牌字节(data[0:1]
),并告诉调用者将输入数据向前推进一个字节。