Golang语言(打卡✏️第四天)fmt格式化工具|Go主题月

简介: Print系列函数会将内容输出到系统的标准输出,区别在于Print函数直接输出内容,Printf函数支持格式化输出字符串,Println函数会在输出内容的结尾添加一个换行符。

Println输出



Print系列函数会将内容输出到系统的标准输出,区别在于Print函数直接输出内容,Printf函数支持格式化输出字符串,Println函数会在输出内容的结尾添加一个换行符。


fmt.Println("Println输出,尾部会有换行符")
print("print输出")

Fprint



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


实例:


// 向标准输出写入内容
fmt.Fprintln(os.Stdout, "向标准输出写入内容")
fileObj, err := os.OpenFile("./test.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接口的类型都支持写入。
Sprint

Sprint系列函数会把传入的数据生成并返回一个字符串。


实例:


a:=fmt.Sprint("叫我詹躲躲")
fmt.Println(a) //叫我詹躲躲
fmt.Sprint("我是%s",a) //叫我詹躲躲


Errorf



Errorf函数根据format参数生成格式化字符串并返回一个包含该字符串的错误。

通常使用这种方式来自定义错误类型。


fmt.Errorf("这是一个报错信息!")
fmt.Errorf函数新加了一个%w占位符用来生成一个可以包裹Error的Wrapping Error。
err:=errors.News("报错信息")
w:=fmt.Errorf("包裹wrap %w",err)


printf



支持各种占位符。


占位符 说明
% 是字符串运算符,被称为格式化操作符。
%v 值的默认格式表示
%+v 类似%v,但输出结构体时会添加字段名
%#v 值的Go语法表示
%t 布尔值
%T 打印值的类型
%% 百分号
%b 二进制表示
%c 相应Unicode码点所表示的字符
%d 十进制表示
%o 八进制表示
%q 单引号围绕的字符字面值,由Go语法安全地转义
%x 十六进制表示,字母形式为小写 a-f
%X 十六进制表示,字母形式为大写 A-F
%U Unicode格式:U+1234,等同于 "U+%04X"
%s 字符串或切片的无解译字节
%q 双引号围绕的字符串,由Go语法安全地转义
%x 十六进制,小写字母,每字节两个字符
%X 十六进制,大写字母,每字节两个字符
%p 十六进制表示,前缀 0x


默认格式


类型 占位符
bool: %t
int, int8 etc.: %d
uint, uint8 etc.: %d, %x if printed with %#v
float32, complex64, etc: %g
string: %s
chan: %p
pointer: %p


+总打印数值的正负号;对于%q(%+q)保证只输出ASCII编码的字符。


  • 左对齐

备用格式:为八进制添加前导 0(%#o),为十六进制添加前导 0x(%#x)或0X(%#X),为 %p(%#p)去掉前导 0x;对于 %q,若 strconv.CanBackquote 返回 true,就会打印原始(即反引号围绕的)字符串;如果是可打印字符,%U(%#U)会写出该字符的Unicode编码形式(如字符 x 会被打印成 U+0078 'x')。


' ' (空格)为数值中省略的正负号留出空白(% d);以十六进制(% x, % X)打印字符串或切片时,在字节之间用空格隔开


0 填充前导的0而非空格;对于数字,这会将填充移到正负号之后


p := point{1, 2}
    fmt.Printf("%v\n", p) //{1,2}
    fmt.Printf("%+v\n", p) //{x:1 y:2}
    fmt.Printf("%#v\n", p) //main.point{x:1, y:2}
    fmt.Printf("%T\n", p) // main.point
    fmt.Printf("%t\n", true) //true
    fmt.Printf("%d\n", 123) //123
    fmt.Printf("%b\n", 14) //1110
    fmt.Printf("%c\n", 33) //!
    fmt.Printf("%x\n", 456) //1c8
    fmt.Printf("%f\n", 78.9) //78.900000
    fmt.Printf("%e\n", 123400000.0) //1.234000e+08
    fmt.Printf("%E\n", 123400000.0) //1.234000E+08
    fmt.Printf("%s\n", "\"string\"") //"string"
    fmt.Printf("%q\n", "\"string\"")//"\"string\""
    fmt.Printf("%x\n", "hex this") //6865782074686973
    fmt.Printf("%p\n", &p) //0xc0000b4010
    fmt.Printf("|%6d|%6d|\n", 12, 345) //|    12|   345|
    fmt.Printf("|%6.2f|%6.2f|\n", 1.2, 3.45) //|  1.20|  3.45|
    fmt.Printf("|%-6.2f|%-6.2f|\n", 1.2, 3.45) //|1.20  |3.45  |
    fmt.Printf("|%6s|%6s|\n", "foo", "b") //|   foo|     b|
    fmt.Printf("|%-6s|%-6s|\n", "foo", "b") //|foo   |b     |
    s := fmt.Sprintf("a %s", "string") 
    fmt.Println(s) //a string
    fmt.Fprintf(os.Stderr, "an %s\n", "error")//an error


宽度标识符



宽度通过一个紧跟在百分号后面的十进制数指定,如果未指定宽度,则表示值时除必需之外不作填充。精度通过(可选的)宽度后跟点号后跟的十进制数指定。如果未指定精度,会使用默认精度;如果点号后没有跟数字,表示精度为0。


占位符 说明

%f 默认宽度,默认精度

%9f 宽度9,默认精度

%.2f 默认宽度,精度2

%9.2f 宽度9,精度2

%9.f 宽度9,精度0


获取输出


Go语言fmt包下有fmt.Scan、fmt.Scanf、fmt.Scanln三个函数,可以在程序运行过程中从标准输入获取用户的输入。


fmt.Scan



Scan从标准输入扫描文本,读取由空白符分隔的值保存到传递给本函数的参数中,换行符视为空白符。


本函数返回成功扫描的数据个数和遇到的任何错误。如果读取的数据个数比提供的参数少,会返回一个错误报告原因。


fmt.Scan从标准输入中扫描用户输入的数据,将以空白符分隔的数据分别存入指定的参数。


fmt.Scanf



Scanf从标准输入扫描文本,根据format参数指定的格式去读取由空白符分隔的值保存到传递给本函数的参数中。


本函数返回成功扫描的数据个数和遇到的任何错误。


fmt.Scanf不同于fmt.Scan简单的以空格作为输入数据的分隔符,fmt.Scanf为输入数据指定了具体的输入内容格式,只有按照格式输入数据才会被扫描并存入对应变量。


fmt.Scanln



Scanln类似Scan,它在遇到换行时才停止扫描。最后一个数据后面必须有换行或者到达结束位置。


本函数返回成功扫描的数据个数和遇到的任何错误。


fmt.Scanln遇到回车就结束扫描了,这个比较常用


几种输入方式的区别



输出方式 区别
Scan、Scanf 和 Scanln 从os.Stdin 中读取;
Fscan、Fscanf 和 Fscanln 从指定的 io.Reader 中读取;
Sscan、Sscanf 和 Sscanln 从实参字符串中读取。
Scanln、Fscanln 和 Sscanln 在换行符处停止扫描,且需要条目紧随换行符之后;
Scanf、Fscanf 和 Sscanf 需要输入换行符来匹配格式中的换行符;其它函数则将换行符视为空格。


bufio.NewReader



func bufioDemo() {
reader := bufio.NewReader(os.Stdin) // 从标准输入生成读对象
fmt.Print("请输入内容:")
text, _ := reader.ReadString('\n') // 读到换行
text = strings.TrimSpace(text)
fmt.Printf("%#v\n", text)
}


Fscan系列



fmt.Scan、fmt.Scanf、fmt.Scanln三个函数,只不过它们不是从标准输入中读取数据而是从io.Reader中读取数据。


Sscan系列



fmt.Scan、fmt.Scanf、fmt.Scanln三个函数,只不过它们不是从标准输入中读取数据而是从指定字符串中读取数据。

相关文章
|
2天前
|
程序员 Go PHP
为什么大部分的 PHP 程序员转不了 Go 语言?
【9月更文挑战第8天】大部分 PHP 程序员难以转向 Go 语言,主要因为:一、编程习惯与思维方式差异,如语法风格和编程范式;二、学习成本高,需掌握新知识体系且面临项目压力;三、职业发展考量,现有技能价值及市场需求不确定性。学习新语言虽有挑战,但对拓宽职业道路至关重要。
24 10
|
8天前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
36 4
Golang语言之管道channel快速入门篇
|
8天前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
37 3
Golang语言之gRPC程序设计示例
|
8天前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
30 4
|
8天前
|
Go 调度
Golang语言goroutine协程篇
这篇文章是关于Go语言goroutine协程的详细教程,涵盖了并发编程的常见术语、goroutine的创建和调度、使用sync.WaitGroup控制协程退出以及如何通过GOMAXPROCS设置程序并发时占用的CPU逻辑核心数。
19 4
Golang语言goroutine协程篇
|
8天前
|
Prometheus Cloud Native Go
Golang语言之Prometheus的日志模块使用案例
这篇文章是关于如何在Golang语言项目中使用Prometheus的日志模块的案例,包括源代码编写、编译和测试步骤。
17 3
Golang语言之Prometheus的日志模块使用案例
|
2天前
|
算法 程序员 Go
PHP 程序员学会了 Go 语言就能唬住面试官吗?
【9月更文挑战第8天】学会Go语言可提升PHP程序员的面试印象,但不足以 solely “唬住” 面试官。学习新语言能展现学习能力、拓宽技术视野,并增加就业机会。然而,实际项目经验、深入理解语言特性和综合能力更为关键。全面展示这些方面才能真正提升面试成功率。
21 10
|
2天前
|
编译器 Go
go语言学习记录(关于一些奇怪的疑问)有别于其他编程语言
本文探讨了Go语言中的常量概念,特别是特殊常量iota的使用方法及其自动递增特性。同时,文中还提到了在声明常量时,后续常量可沿用前一个值的特点,以及在遍历map时可能遇到的非顺序打印问题。
|
6天前
|
安全 大数据 Go
深入探索Go语言并发编程:Goroutines与Channels的实战应用
在当今高性能、高并发的应用需求下,Go语言以其独特的并发模型——Goroutines和Channels,成为了众多开发者眼中的璀璨明星。本文不仅阐述了Goroutines作为轻量级线程的优势,还深入剖析了Channels作为Goroutines间通信的桥梁,如何优雅地解决并发编程中的复杂问题。通过实战案例,我们将展示如何利用这些特性构建高效、可扩展的并发系统,同时探讨并发编程中常见的陷阱与最佳实践,为读者打开Go语言并发编程的广阔视野。
|
4天前
|
存储 Shell Go
Go语言结构体和元组全面解析
Go语言结构体和元组全面解析