go语言中fmt包的基本用法

本文详细介绍了Go语言中fmt包的使用方法,包括基本的打印功能如Print、Printf、Println,以及向文件写入内容的Fprint和Fprintf函数。此外还讲解了Sprint系列函数如何生成字符串,并演示了各种格式化输出的例子。

go语言中fmt包的基本用法  原文参考:https://www.liwenzhou.com/posts/Go/go_fmt/

fmt.print

func main() {
	fmt.Print("在终端打印信息")
	name := "沙河小王子"
	fmt.Printf("我是%s\n", name)
	fmt.Println("在终端打印一条显示")
	fmt.Println(name) //直接打印变量内容

}
输出结果
C:\Users\34826\AppData\Local\Temp\___go_build_main_go__1_.exe #gosetup
在终端打印信息我是沙河小王子
在终端打印一条显示
沙河小王子

Fprint

func main() {
	//fprint
	//向标准输出写入内容
	fmt.Fprintln(os.Stdout, "向标准输出写入此内容")
	fileObj, err := os.OpenFile("./xx.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
	if err != nil {
		fmt.Println("打开文件出错,err:", err)
		return
	}
	name := "沙河小王子"
	//向打开的文件句柄中写内容
	fmt.Fprintf(fileObj, "往文件中写入信息:%s", name)
	//注意只要满足io.writer的接口类型都支持写入
}
输出结果
C:\Users\34826\AppData\Local\Temp\___go_build_main_go__1_.exe #gosetup
向标准输出写入此内容

Sprint

func main() {
	//Sprint系列函数会吧传入的数据生成并返回一个字符串这里的S 貌似就是String的首字母
	s1 := fmt.Sprint("沙河小王子\n")
	name := "沙河小王子"
	age := 18
	s2 := fmt.Sprintf("name: %s, age %d\n", name, age)
	s3 := fmt.Sprintln("沙河小王子")
	fmt.Println(s1, s2, s3)
}

输出结果
C:\Users\34826\AppData\Local\Temp\___go_build_main_go__1_.exe #gosetup
沙河小王子
 name: 沙河小王子, age 18
 沙河小王子

*printf带有占位符的打印

//格式化占位符
//*printf结尾的方法都支持format格式化参数,这里我们按照占位符将被替换的变量类型进行划分,方便查询和记忆.
func main() {
	fmt.Printf("%v\n", 100)  //打印int类型
	fmt.Printf("%v\n", false) //打印bool类型
	o := struct {
		name string
	}{"小孙子"}
	fmt.Printf("%v\n", o) //打印struct类型
	fmt.Printf("%#v\n", o) //标准化打印输出struct类型
	fmt.Printf("%T\n", o) //打印类型
	fmt.Printf("100%%\n") //打印百分数
}
输出结果
C:\Users\34826\AppData\Local\Temp\___go_build_main_go__1_.exe #gosetup
100
false
{小孙子}
struct { name string }{name:"小孙子"}
struct { name string }
100%

整型

占位符说明
%b表示为二进制
%c该值对应的unicode码值
%d表示为十进制
%o表示为八进制
%x表示为十六进制,使用a-f
%X表示为十六进制,使用A-F
%U表示为Unicode格式:U+1234,等价于”U+%04X”
%q该值对应的单引号括起来的go语法字符字面值,必要时会采用安全的转义表示

 

示例代码如下:

n := 65
fmt.Printf("%b\n", n)
fmt.Printf("%c\n", n)
fmt.Printf("%d\n", n)
fmt.Printf("%o\n", n)
fmt.Printf("%x\n", n)
fmt.Printf("%X\n", n)
输出结果如下:

1000001
A
65
101
41
41

字符串和[]byte

占位符说明
%s直接输出字符串或者[]byte
%q该值对应的双引号括起来的go语法字符串字面值,必要时会采用安全的转义表示
%x每个字节用两字符十六进制数表示(使用a-f
%X每个字节用两字符十六进制数表示(使用A-F)

 获取输入

fmt.Scan

func main() {
	var (
		name    string
		age     int
		married bool
	)
	fmt.Scan(&name, &age, &married)                                     //这里接受三个值,分别以空格进行分隔.
	fmt.Printf("扫描结果:name : %v,age %v,married :%v", name, age, married) //这里打印接受的三个值.
}

输出结果
D:\Go\Go\src\code.oldboy.com\studygolang\05lesson5\xueshengguanlixit>xueshengguanlixit.exe
xiaowangzi  18 false
扫描结果:name : xiaowangzi,age 18,married :false

fmt.Scanf

func main() {
	var (
		name    string
		age     int
		married bool
	)
	fmt.Scanf("1,%s 2,%d 3,%t", &name, &age, &married)                  //这里预留了三个占位符,
	fmt.Printf("扫描结果:name : %s,age %d,married :%t", name, age, married) //这里打印接受的三个值.
}
输出结果
D:\Go\Go\src\code.oldboy.com\studygolang\05lesson5\xueshengguanlixit>xueshengguanlixit.exe
1,xiaohuozi 2,22 3,true
扫描结果:name : xiaohuozi,age 22,married :true


这里说明一下
    在使用Scanf的时候接受终端输入的格式要与终端中输入的格式一样才可以.要不然是无法接收到输入值的.

Scanln

//获取输入
func main() {
	var (
		name    string
		age     int
		married bool
	)
	fmt.Scanln(&name, &age, &married)                                   //这里输入接收值,遇到回车就进行结束接受扫描操作.
	fmt.Printf("扫描结果:name : %s,age %d,married :%t", name, age, married) //这里打印接受的三个值.
}
输出结果
D:\Go\Go\src\code.oldboy.com\studygolang\05lesson5\xueshengguanlixit>xueshengguanlixit.exe
xiaolaodi 22 true
扫描结果:name : xiaolaodi,age 22,married :true

说明一下:
    这里使用空格进行分隔,连续接受三个值.遇到换行符就终止
D:\Go\Go\src\code.oldboy.com\studygolang\05lesson5\xueshengguanlixit>xueshengguanlixit.exe
xiaolaodi
扫描结果:name : xiaolaodi,age 0,married :false
这里只输入了一个值,然后使用回车后就直接将一个值传入到代码中了,其余的是默认类型的零值.

bufio.Newreader

//使用bufil.NewReader
func main() {
	reader := bufio.NewReader(os.Stdin) //从标准输入生成读对象
	fmt.Print("请输入内容:")                //这里使用print不换行
	text, _ := reader.ReadString('\n') //这里表示读到换行符
	text = strings.TrimSpace(text)     //去掉前后空格
	fmt.Printf("%#v\n", text) //打印输入内容
}
输出结果
    D:\Go\Go\src\code.oldboy.com\studygolang\05lesson5\xueshengguanlixit>xueshengguanlixit.exe
请输入内容:asd asd fkash aksjdh kaakjl kjadfhlkasdfjlk
"asd asd fkash aksjdh kaakjl kjadfhlkasdfjlk"

 

<think>好的,用户想了解Go语言fmt用法和功能。首先,我需要整理fmt的主要功能,括格式化输入输出,比如Print、Printf、Println的区别,以及Sprintf、Fprintf等函数的用途。然后,要详细说明常用的格式化动词,比如%v、%T、%d等,并给出具体的例子,这样用户更容易理解。另外,输入相关的函数如Scan、Scanf、Scanln也需要介绍,说明它们的使用场景。可能还需要提到错误处理和格式化选项,比如宽度、精度、对齐方式等。 根据用户提供的引用内容,引用1和引用2提到了fmt的重要性以及Printf的格式化选项,引用3是关于Fprintf的函数签名。需要将这些信息整合到回答中,确保引用标记正确。同时,用户的问题还要求生成相关问题,所以得想几个相关的问题,比如如何控制输出宽度,输入函数的区别,或者如何自定义类型的格式化输出。 需要注意的是,回答的结构要清晰,分点说明,同时代码示例要用正确的格式,比如使用反引号Go代码。另外,数学表达式要用$...$,但在这个问题中可能涉及较少,不过如果有示例中的数字或变量,需要注意格式。最后,确保语言口语化,避免使用专业术语过多,让用户容易理解。</think># Go语言fmt使用说明与功能介绍 ## 一、基础功能概述 Go语言fmt是处理格式化输入输出的核心工具,提供超过20个格式化动词和多种控制选项。主要功能模块含: 1. **标准输出函数** - `Print()`:基础输出,不换行 - `Println()`:自动添加换行和空格分隔 - `Printf()`:支持格式化模板输出 ```go fmt.Printf("字符串:%s 整数:%d 浮点:%.2f\n", "hello", 42, 3.1415) ``` 2. **字符串构建函数** - `Sprintf()`:返回格式化字符串 ```go s := fmt.Sprintf("当前温度:%v°C", 23.5) ``` 3. **流式输出函数** - `Fprintf()`:向指定io.Writer写入 ```go file, _ := os.Create("log.txt") fmt.Fprintf(file, "错误代码:%05d", 404) ``` ## 二、核心格式化参数(部分) | 动词 | 说明 | 示例 | 输出结果 | |------|-----------------------|---------------------|-----------------| | `%v` | 通用格式 | `%v`, 42 | 42 | | `%T` | 类型输出 | `%T`, "text" | string | | `%d` | 十进制整数 | `%05d`, 123 | 00123 | | `%f` | 浮点数 | `%.2f`, 3.1415 | 3.14 | | `%p` | 指针地址 | `%p`, &var | 0xc000018088 | ## 三、输入处理函数 1. **`Scan()`系列** ```go var name string fmt.Scan(&name) // 读取空格分隔输入 ``` 2. **`Scanf()`格式化输入** ```go fmt.Scanf("%d-%d", &year, &month) // 输入"2023-08" ``` 3. **`Scanln()`行读取** ```go fmt.Scanln(&address) // 读取整行输入 ``` ## 四、高级格式化控制 1. **宽度与精度** ```go fmt.Printf("|%8.2f|%-8s|", 3.1416, "END") // 输出:| 3.14|END | ``` 2. **自定义类型格式化** 实现`Stringer`接口: ```go type Point struct{ X, Y int } func (p Point) String() string { return fmt.Sprintf("(%d,%d)", p.X, p.Y) } ``` ## 五、错误处理实践 格式化函数返回写入字节数和错误对象: ```go n, err := fmt.Fprintf(os.Stderr, "错误:%v", io.EOF) if err != nil { // 错误处理 } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值