Go语言fmt包的具体使用

 更新时间:2025年07月15日 09:08:35   作者:Go Dgg  
Go语言的fmt包提供了丰富多样的输入输出功能,无论是格式化输出、文件写入,还是从各种输入源读取数据,都能轻松应对,具有一定的参考价值,感兴趣的可以了解一下

在Go语言中,fmt包是一个非常常用的包,它提供了丰富的格式化输入输出功能,使得数据的输入输出变得更加灵活和便捷。本文将详细介绍fmt包的常用函数及其用法,帮助你更好地理解和使用这个强大的工具。

一、向外输出

Print系列函数

fmt包提供了PrintPrintfPrintln三个函数,用于向标准输出(通常是控制台)打印内容。

  • Print函数直接输出内容,不添加任何修饰。
  • Printf函数支持格式化输出字符串,可以根据指定的格式化字符串来格式化输出。
  • Println函数在输出内容的结尾添加一个换行符(\n),并且会在各个元素之间添加空格。

函数签名如下:

func Print(a ...interface{})(n int, err error)
func Printf(format string, a ...interface{})(n int, err error)
func Println(a ...interface{})(n int, err error)

参数说明

  • aPrintPrintln函数接受一个或多个interface{}类型的值作为参数,这些值将被格式化为字符串并输出。
  • formatPrintf函数的格式化字符串,其中可以包含占位符(如%d%s等)来指定如何格式化参数。

返回值

  • n:表示成功写入的字节数。
  • err:如果发生错误,则返回错误信息,否则为nil

适用场景

  • 当需要快速输出调试信息或简单的内容时,可以使用PrintPrintln函数。
  • 当需要对输出的内容进行格式化控制时,Printf函数是一个很好的选择。

示例代码

package main

import "fmt"

func main() {
    fmt.Print("Hello, World!")  // 输出:Hello, World!
    fmt.Printf("Name: %s, Age: %d", "Alice", 25)  // 输出:Name: Alice, Age: 25
    fmt.Println("Hello, World!")  // 输出:Hello, World!(带换行)
}

Fprint系列函数

Fprint系列函数会将内容输出到一个io.Writer接口类型的变量w中,通常用于往文件中写入内容。

func Fprint(w io.Writer, a ...interface{})(n int, err error)
func Fprintf(w io.Writer, format string, a ...interface{})(n int, err error)
func Fprintln(w io.Writer, a ...interface{})(n int, err error)

参数说明

  • w:一个实现了io.Writer接口的对象,表示输出流。常见的io.Writer包括os.Stdout(标准输出)、os.Stderr(标准错误)以及文件对象等。
  • a:要格式化并写入的值列表。
  • format:格式化字符串,其中可以包含占位符来指定如何格式化参数。

返回值

  • n:写入的字节数。
  • err:如果发生错误,则返回错误信息,否则为nil

适用场景

  • 当需要将内容写入到文件或其他输出流时,Fprint系列函数非常有用。

示例代码

package main

import (
	"fmt"
	"os"
)

func main() {
	// 将输出写入到标准输出
	n, err := fmt.Fprint(os.Stdout, "Hello, World!")
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	fmt.Println("\nWritten", n, "bytes")

	// 将输出写入到文件
	file, err := os.Create("output.txt")
	if err != nil {
		fmt.Println("Error creating file:", err)
		return
	}
	defer file.Close()

	n, err = fmt.Fprint(file, "This is written to a file.")
	if err != nil {
		fmt.Println("Error writing to file:", err)
		return
	}
	fmt.Println("Written", n, "bytes to file")
}

Sprint系列函数

Sprint系列函数会把传入的数据生成并返回一个字符串,用于将一组值格式化为字符串。与Printf类似,但它不输出到任何地方,而是将结果作为字符串返回。

func Sprint(a ...interface{}) string
func Sprintf(format string, a ...interface{}) string
func Sprintln(a ...interface{}) string

参数说明

  • a:要格式化并转换为字符串的值列表。
  • format:格式化字符串,其中可以包含占位符来指定如何格式化参数。

返回值

  • 返回一个字符串,表示格式化后的结果。

适用场景

  • 当需要将多个值组合成一个字符串进行后续处理时,Sprint系列函数非常方便。

示例代码

package main

import "fmt"

func main() {
	// 示例1
	str1 := fmt.Sprint("Hello, ", "World!")
	fmt.Println(str1) // 输出:Hello, World!

	// 示例2
	name := "Alice"
	age := 25
	str2 := fmt.Sprintf("Name: %s, Age: %d", name, age)
	fmt.Println(str2)
	// 输出:Name: Alice, Age: 25

	// 示例3
	name := "Alice"
	age := 25
	str3 := fmt.Sprintln("Name: ", name, " Age: ", age)
	fmt.Print(str3)
	// 输出:Name: Alice Age: 25\n

	// 示例4:格式化多个数据项
	data := []int{1, 2, 3, 4, 5}
	str4 := fmt.Sprint("Data: ", data)
	fmt.Println(str4) // 输出:Data: [1 2 3 4 5]
}

Errorf函数

Errorf是Go语言中fmt包的一个函数,用于生成一个格式化的错误消息并将其作为error类型返回。

func Errorf(format string, a ...any) error

参数说明

  • format:格式化字符串,其中可以包含占位符来指定如何格式化参数。
  • a:要格式化的值列表,这些值将根据格式化字符串中的占位符进行格式化。

返回值

  • 返回一个error类型的值,表示格式化后的错误消息。

适用场景

  • 在需要返回错误信息的场景中,Errorf函数可以帮助我们快速生成格式化的错误消息。

示例代码

package main

import "fmt"

func main() {
	// 示例1:简单的错误消息
	err1 := fmt.Errorf("an error occurred")
	fmt.Println(err1) // 输出:an error occurred

	// 示例2:包含变量的错误消息
	filename := "data.txt"
	err2 := fmt.Errorf("failed to open file: %s", filename)
	fmt.Println(err2) // 输出:failed to open file: data.txt

	// 示例3:包含多个变量的错误消息
	age := 25
	err3 := fmt.Errorf("invalid age %d for user %s", age, "Alice")
	fmt.Println(err3) // 输出:invalid age 25 for user Alice

	// 示例4:嵌套错误
	err4 := fmt.Errorf("wrapper error: %w", err2)
	fmt.Println(err4) // 输出:wrapper error: failed to open file: data.txt
}

二、获取输入

fmt.Scan系列函数

fmt.Scanfmt.Scanffmt.Scanln函数用于从标准输入(通常是键盘)读取数据,并根据格式字符串将输入值转换为变量。

  • fmt.Scan:从标准输入读取数据,根据变量的类型自动匹配输入的格式。
  • fmt.Scanf:从标准输入读取数据,并根据格式字符串将输入值转换为变量,允许更精确的格式控制。
  • fmt.Scanln:从标准输入读取一行数据,并根据格式字符串将输入值转换为变量,在读取输入后会消费掉换行符。

函数签名如下:

func Scan(a ...any) (n int, err error)
func Scanf(format string, a ...any) (n int, err error)
func Scanln(a ...any) (n int, err error)

参数说明

  • format:格式化字符串,其中可以包含占位符来指定如何解析输入值。
  • a:一个或多个指针类型的参数,表示要存储输入值的变量。

返回值

  • n:成功读取的值的数量。
  • err:如果发生错误,则返回错误信息,否则为nil

适用场景

  • 当需要从控制台读取用户输入时,fmt.Scan系列函数非常有用。

示例代码

package main

import "fmt"

func main() {
	// fmt.Scan示例
	var num int
	fmt.Print("Enter an integer: ")
	_, err := fmt.Scan(&num)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	fmt.Println("You entered:", num)

	// fmt.Scanf示例
	var name string
	var age int
	var height float64
	fmt.Print("Enter name, age, and height: ")
	_, err = fmt.Scanf("%s %d %f", &name, &age, &height)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	fmt.Printf("Name: %s, Age: %d, Height: %.2f\n", name, age, height)

	// fmt.Scanln示例
	var sentence string
	fmt.Print("Enter a sentence: ")
	_, err = fmt.Scanln(&sentence)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	fmt.Println("You entered:", sentence)
}

Fscan系列函数

FscanFscanlnFscanf函数用于从一个io.Reader中读取数据,并根据格式字符串将输入值转换为变量。

func Fscan(r io.Reader, a ...interface{}) (n int, err error)
func Fscanln(r io.Reader, a ...interface{}) (n int, err error)
func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error)

参数说明

  • r:一个实现了io.Reader接口的对象,表示要读取数据的输入流。
  • a:一个或多个指针类型的参数,表示要存储输入值的变量。
  • format:格式化字符串,其中可以包含占位符来指定如何解析输入值。

返回值

  • n:成功读取的值的数量。
  • err:如果发生错误,则返回错误信息,否则为nil

适用场景

  • 当需要从文件、网络流等io.Reader中读取数据时,Fscan系列函数非常有用。

示例代码

package main

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

func main() {
	// 示例1:从标准输入读取
	reader := bufio.NewReader(os.Stdin)
	var num1, num2 int
	fmt.Print("Enter two integers: ")
	_, err := fmt.Fscan(reader, &num1, &num2)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	fmt.Printf("You entered: %d and %d\n", num1, num2)

	// 示例2:从字符串读取
	data := "Alice 25 1.75\nBob 30 1.80"
	strReader := strings.NewReader(data)
	var name string
	var age int
	var height float64

	// 读取第一行
	_, err = fmt.Fscan(strReader, &name, &age, &height)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	fmt.Printf("Name: %s, Age: %d, Height: %.2f\n", name, age, height)

	// 读取第二行
	_, err = fmt.Fscan(strReader, &name, &age, &height)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	fmt.Printf("Name: %s, Age: %d, Height: %.2f\n", name, age, height)

	// 示例3:从文件读取
	file, err := os.Open("input.txt")
	if err != nil {
		fmt.Println("Error opening file:", err)
		return
	}
	defer file.Close()

	var filename string
	var size int
	var isReadable bool

	_, err = fmt.Fscan(file, &filename, &size, &isReadable)
	if err != nil {
		fmt.Println("Error reading file:", err)
		return
	}
	fmt.Printf("Filename: %s, Size: %d, IsReadable: %t\n", filename, size, isReadable)
}

Sscan系列函数

SscanSscanlnSscanf函数用于从一个字符串中读取数据,并根据格式字符串将输入值转换为变量。

func Sscan(str string, a ...interface{}) (n int, err error)
func Sscanln(str string, a ...interface{}) (n int, err error)
func Sscanf(str string, format string, a ...interface{}) (n int, err error)

参数说明

  • str:要解析的字符串。
  • a:一个或多个指针类型的参数,表示要存储输入值的变量。
  • format:格式化字符串,其中可以包含占位符来指定如何解析输入值。

返回值

  • n:成功读取的值的数量。
  • err:如果发生错误,则返回错误信息,否则为nil

适用场景

  • 当需要从字符串中提取数据时,Sscan系列函数非常方便。

示例代码

package main

import "fmt"

func main() {
	// 示例1:从字符串读取一个整数
	str1 := "42"
	var num int
	_, err := fmt.Sscan(str1, &num)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	fmt.Println("You entered:", num)

	// 示例2:从字符串读取多个值
	str2 := "Alice 25 1.75"
	var name string
	var age int
	var height float64
	_, err = fmt.Sscan(str2, &name, &age, &height)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	fmt.Printf("Name: %s, Age: %d, Height: %.2f\n", name, age, height)

	// 示例3:从字符串读取布尔值
	str3 := "true"
	var isStudent bool
	_, err = fmt.Sscan(str3, &isStudent)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	fmt.Println("Is Student:", isStudent)

	// 示例4:从字符串读取带有空格的字符串
	str4 := `"Hello World"`
	var sentence string
	_, err = fmt.Sscan(str4, &sentence)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	fmt.Println("You entered:", sentence)
}

三、总结

Go语言的fmt包提供了丰富多样的输入输出功能,无论是格式化输出、文件写入,还是从各种输入源读取数据,都能轻松应对。熟练掌握fmt包的使用,能够让你在Go语言的开发中更加得心应手,提高开发效率和代码的可读性。希望本文对你理解和使用fmt包有所帮助!

到此这篇关于Go语言fmt包的具体使用的文章就介绍到这了,更多相关Go语言fmt包内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang高并发限流操作 ping / telnet

    golang高并发限流操作 ping / telnet

    这篇文章主要介绍了golang高并发限流操作 ping / telnet,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go语言使用HTTP包创建WEB服务器的方法

    Go语言使用HTTP包创建WEB服务器的方法

    这篇文章主要介绍了Go语言使用HTTP包创建WEB服务器的方法,结合实例形式分析了Go语言基于HTTP包创建WEB服务器客户端与服务器端的实现方法与相关注意事项,需要的朋友可以参考下
    2016-07-07
  • 使用golang实现在屏幕上打印进度条的操作

    使用golang实现在屏幕上打印进度条的操作

    这篇文章主要介绍了使用golang实现在屏幕上打印进度条的操作,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Go-RESTful实现下载功能思路详解

    Go-RESTful实现下载功能思路详解

    这篇文章主要介绍了Go-RESTful实现下载功能,文件下载包括文件系统IO和网络IO,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • Go 1.21新内置函数min、max和clear的用法详解

    Go 1.21新内置函数min、max和clear的用法详解

    Go 1.21 版本已经正式发布,它带来了许多新特性和改进,其中引入了的三个新内置函数:max、min 和 clear,接下来我们就来看看这些函数的用途和特点吧
    2023-08-08
  • Go检查结构体中是否存在某个字段及创建结构体切片或映射

    Go检查结构体中是否存在某个字段及创建结构体切片或映射

    这篇文章主要为大家介绍了Go检查结构体中是否存在某个字段及创建结构体切片或映射实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Go语言实现运算符重载的方法详解

    Go语言实现运算符重载的方法详解

    这篇文章主要为大家详细介绍了如何利用Go语言实现运算符重载的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-09-09
  • golang协程关闭踩坑实战记录

    golang协程关闭踩坑实战记录

    协程(coroutine)是Go语言中的轻量级线程实现,下面这篇文章主要给大家介绍了关于golang协程关闭踩坑的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • Golang限流库与漏桶和令牌桶的使用介绍

    Golang限流库与漏桶和令牌桶的使用介绍

    这篇文章主要介绍了golang限流库以及漏桶与令牌桶的实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-03-03
  • 详解Golang中interface接口的原理和使用技巧

    详解Golang中interface接口的原理和使用技巧

    interface 接口在 Go 语言里面的地位非常重要,是一个非常重要的数据结构。本文主要介绍了Golang中interface接口的原理和使用技巧,希望对大家有所帮助
    2022-11-11

最新评论