Golang中bufio和scanf的区别到底是什么?

Golang中bufio和scanf的区别到底是什么? 嗨,我很好奇。为什么它们有不同的用途?

1 回复

更多关于Golang中bufio和scanf的区别到底是什么?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中,bufiofmt.Scanf都是用于输入处理,但设计目标和适用场景有本质区别。

bufio包提供了缓冲I/O,适用于需要高效读取大量数据的场景,尤其是文件或网络流。它通过减少系统调用次数来提升性能。例如:

package main

import (
    "bufio"
    "fmt"
    "strings"
)

func main() {
    input := "line1\nline2\nline3"
    scanner := bufio.NewScanner(strings.NewReader(input))
    
    for scanner.Scan() {
        fmt.Println(scanner.Text()) // 逐行读取
    }
}

fmt.Scanf则用于格式化输入解析,适合读取结构化数据。它直接基于io.Reader工作,每次调用都可能触发系统调用:

package main

import "fmt"

func main() {
    var name string
    var age int
    
    // 从标准输入解析格式化数据
    fmt.Scanf("%s %d", &name, &age)
    fmt.Printf("Name: %s, Age: %d\n", name, age)
}

关键区别:

  1. 性能bufio通过缓冲减少I/O操作,Scanf每次读取都可能访问底层I/O
  2. 功能bufio.Scanner提供行读取等高级功能,Scanf专注格式解析
  3. 错误处理Scanner提供更细粒度的错误控制

实际选择取决于需求:处理大文件或流用bufio,简单格式化输入用Scanf

回到顶部