go 圣经中习题 7.1 的疑问?

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

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

网上看的一个答案

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++ // 如果注释了这儿 那么 len(p) 返回结果是 0 
    }
    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++ 
    }
    return len(p), nil
}
阅读 1.4k
1 个回答

描述不对。注释掉 *c++ 不影响 len(p),影响的是wc的值。

package main

import (
    "bufio"
    "bytes"
    "fmt"
)

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

    var wc1, wc2 WordCounter

    // 写法1 输出的是 wc1 的值
    fmt.Fprint(&wc1, s)
    fmt.Printf("wc的值是 %d\n", wc1)

    // 写法2 输出的是 Write 这个函数的返回值
    if lenp, err := wc2.Write([]byte(s)); err != nil {
        panic(err)
    } else {
        fmt.Printf("write 的返回值是 %d\n", lenp)
    }
}

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++ // 如果注释了这儿 那么 wc 的值是 0
    }
    return len(p), nil
}

不注释*c++ 的情况下输出是

wc的值是 4
write 的返回值是 30

注释掉之后的输出是

wc的值是 0
write 的返回值是 30
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题