V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
xoxo419
V2EX  ›  Go 编程语言

go 圣经习题 7.1 的疑问

  •  
  •   xoxo419 · 2021-11-23 14:43:23 +08:00 · 1526 次点击
    这是一个创建于 856 天前的主题,其中的信息可能已经有所发展或是发生改变。

    练习 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 呢?

    -

    3 条回复    2021-11-23 15:20:25 +08:00
    MoYi123
        1
    MoYi123  
       2021-11-23 14:59:19 +08:00
    `return len(p), nil` 是 fmt.Fprintf 的返回值,又不是 lc 的值
    Vegetable
        2
    Vegetable  
       2021-11-23 15:11:21 +08:00
    fmt.Println(lc)是在输出 lc ,也就是内部的*c ,不是"len(p)"
    thevita
        3
    thevita  
       2021-11-23 15:20:25 +08:00   ❤️ 1
    对神经有疑问应该问神学家,我们没有解释权
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1214 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:11 · PVG 02:11 · LAX 11:11 · JFK 14:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.