go 圣经习题 7.1 的疑问

2021-11-23 14:43:23 +08:00
 xoxo419

练习 7.1: 使用来自 ByteCounter 的思路,实现一个针对单词和行数的计数器。

网上看的一个答案

func main() {
	s := "Hello, World!\nHello, 世界!"

	var wc WordCounter
	fmt.Fprintf(&wc, s)
	fmt.Println(wc)

	var lc LineCounter
	fmt.Fprintf(&lc, s)
	fmt.Println(lc)
}

type WordCounter int

func (c *WordCounter) Write(p []byte) (int, error) {
	scanner := bufio.NewScanner(bytes.NewReader(p))
	scanner.Split(bufio.ScanWords)
	for scanner.Scan() {
		*c++
	}
	return len(p), nil
}

type LineCounter int

func (c *LineCounter) Write(p []byte) (int, error) {
	scanner := bufio.NewScanner(bytes.NewReader(p))
	scanner.Split(bufio.ScanLines)
	for scanner.Scan() {
		*c++ // 如果注释了这儿 那么 len(p) 返回结果是 0 
	}
	return len(p), nil
}

Q: 为什么注释了*c++ len(p) 返回结果是 0 呢?

-

1538 次点击
所在节点    Go 编程语言
3 条回复
MoYi123
2021-11-23 14:59:19 +08:00
`return len(p), nil` 是 fmt.Fprintf 的返回值,又不是 lc 的值
Vegetable
2021-11-23 15:11:21 +08:00
fmt.Println(lc)是在输出 lc ,也就是内部的*c ,不是"len(p)"
thevita
2021-11-23 15:20:25 +08:00
对神经有疑问应该问神学家,我们没有解释权

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/817403

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX