Golang中的bufio.NewReader(os.Stdin)和fmt.Scanln()有什么区别

时间:2019-01-10 06:57:20

标签: go

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    in := bufio.NewReader(os.Stdin)
    fmt.Println("Please input S: ")
    S, _ := in.ReadString('\n')
    fmt.Println("Please input J: ")
    J, _ := in.ReadString('\n')
    sum := numJewelsInStones(J,S)
    fmt.Println(sum)
}

func numJewelsInStones(J string, S string) int {
    var sum  int
    for _, s := range S {
        for _, j := range J{
            if s ==j {
                sum ++
            }
        }

    }
    return sum
}

当我在终端上输入“ hello”和“ h”时。该程序将打印2,但1除外。
如果我使用fmt.Scanln(),结果将为1。
是什么导致了这个结果?

1 个答案:

答案 0 :(得分:2)

它们是完全不同的,并且几乎没有关联。

bufio.NewReader()“包装io.Reader或io.Writer对象,创建另一个对象(Reader或Writer),该对象也实现接口,但提供缓冲和一些文本I / O帮助”。 source

换句话说, all 所做的就是在os.Stdin中添加一个缓冲层(在您的示例中)。它根本不解析或解释流。

相反,fmt.Scanln()从流中读取数据(可以缓冲也可以不缓冲,即由bufio包返回),并按空格分隔输入,以将其存储在切片中

通过阅读文档(上面已链接到该文档),您可以获取每个文档的特定详细信息。但是直接回答您的问题“有什么区别?”简直就是“绝对的一切。尽管可以一起使用,但它们几乎没有共同点。”