程序开发 · 2025年2月8日

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

当前位置: > > > > bufio.NewReader(os.Stdin) 和 fmt.Scanln() 有什么区别

来源:stackoverflow
2024-05-01 17:00:45
0浏览
收藏

小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《bufio.NewReader(os.Stdin) 和 fmt.Scanln() 有什么区别》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!

问题内容

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。

是什么导致了这个结果?

解决方案

它们完全不同,而且大多不相关。

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

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

相比之下,从流中读取数据(可能会或可能不会缓冲——即由bufio包返回),用空格分割输入,将其存储在切片中。

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

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注公众号,一起学习编程~