标准库fmt包

输出

Print

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

//Printfmt.Print("在终端打印该消息。") //没有换行符name := "沙河小王总"fmt.Printf("我是:%s\n", name)fmt.Println("在终端打印单独一行显示。") //有换行符//运行结果
在终端打印该消息。我是:沙河小王总
在终端打印单独一行显示。
Fprint

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

//Fprint//向标准输出写入内容fmt.Fprintln(os.Stdout, "向标准输出写入内容")file, err := os.OpenFile("./xxx.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)if err != nil {fmt.Println(err)return}name1 := "沙河小王子"//向打开文件写内容fmt.Fprintf(file, "往文件写入:%s", name1)
Sprint

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

//Sprints1 := fmt.Sprint("沙河小王子")name2 := "沙河小王子"age := 18s2 := fmt.Sprintf("name:%s,age:%d", name2, age)s3 := fmt.Sprintln("沙河小王子")fmt.Println(s1, s2, s3)//运行结果
沙河小王子 name:沙河小王子,age:18 沙河小王子

格式化占位符

*printf系列函数都支持format格式化参数,在这里我们按照占位符将被替换的变量类型划分,方便查询和记忆。

通用占位符
占位符 说明
%v 值的默认格式表示
%+v 类似%v,但输出结构体时会添加字段名
%#v 值的Go语法表示
%T 打印值的类型
%% 百分号

示例代码如下:

fmt.Printf("%v\n", 100)fmt.Printf("%v\n", false)o := struct{ name string }{"小昂子"}fmt.Printf("%v\n", o)fmt.Printf("%#v\n", o)fmt.Printf("%T\n", o)fmt.Printf("100%%\n")//运行结果:
100
false
{小昂子}
struct { name string }{name:"小昂子"}
struct { name string }
100%
布尔型
占位符 说明
%t true或false
整型
占位符 说明
%b 表示为二进制
%c 该值对应的unicode码值
%d 表示为十进制
%o 表示为八进制
%x 表示为十六进制,使用a-f
%X 表示为十六进制,使用A-F
%U 表示为Unicode格式:U+1234,等价于”U+%04X”
%q 该值对应的单引号括起来的go语法字符字面值,必要时会采用安全的转义表示

示例代码

n := 65fmt.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
浮点数与复数
占位符 说明
%b 无小数部分、二进制指数的科学计数法,如-123456p-78
%e 科学计数法,如-1234.456e+78
%E 科学计数法,如-1234.456E+78
%f 有小数部分但无指数部分,如123.456
%F 等价于%f
%g 根据实际情况采用%e或%f格式(以获得更简洁、准确的输出)
%G 根据实际情况采用%E或%F格式(以获得更简洁、准确的输出)
字符串和[]byte
占位符 说明
%s 直接输出字符串或者[]byte
%q 该值对应的双引号括起来的go语法字符串字面值,必要时会采用安全的转义表示
%x 每个字节用两字符十六进制数表示(使用a-f
%X 每个字节用两字符十六进制数表示(使用A-F)

示例代码如下:

s := "小王子"fmt.Printf("%s\n", s)fmt.Printf("%q\n", s)fmt.Printf("%x\n", s)fmt.Printf("%X\n", s)//运行结果
小王子
"小王子"
e5b08fe78e8be5ad90
E5B08FE78E8BE5AD90
指针
占位符 说明
%p 表示为十六进制,并加上前导的0x
宽度标识符

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

占位符 说明
%f 默认宽度,默认精度
%9f 宽度9,默认精度
%.2f 默认宽度,精度2
%9.2f 宽度9,精度2
%9.f 宽度9,精度0
n := 12.34fmt.Printf("%f\n", n)fmt.Printf("%9f\n", n)fmt.Printf("%.2f\n", n)fmt.Printf("%9.2f\n", n)fmt.Printf("%9.f\n", n)//运行结果
12.340000
12.340000
12.3412.3412

其他flag

占位符 说明
’+’ 总是输出数值的正负号;对%q(%+q)会生成全部是ASCII字符的输出(通过转义);
’ ‘ 对数值,正数前加空格而负数前加负号;对字符串采用%x或%X时(% x或% X)会给各打印的字节之间加空格
’-’ 在输出右边填充空白而不是默认的左边(即从默认的右对齐切换为左对齐);
’#’ 八进制数前加0(%#o),十六进制数前加0x(%#x)或0X(%#X),指针去掉前面的0x(%#p)对%q(%#q),对%U(%#U)会输出空格和单引号括起来的go字面值;
‘0’ 使用0而不是空格填充,对于数值类型会把填充的0放在正负号后面;

输入

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

fmt.Scan
  • Scan从标准输入扫描文本,读取由空白符分隔的值保存到传递给本函数的参数中,换行符视为空白符。
  • 本函数返回成功扫描的数据个数和遇到的任何错误。如果读取的数据个数比提供的参数少,会返回一个错误报告原因。
var (name     stringage      intmarraied bool)fmt.Scan(&name, &age, &marraied)fmt.Printf("扫描结果 name:%s age:%d married:%t \n", name, age, marraied)//运行结果
王磊 23 true
扫描结果 name:王磊 age:23 married:true
fmt.Scanf

函数签名如下:

func Scanf(format string, a ...interface{}) (n int, err error)
  • Scanf从标准输入扫描文本,根据format参数指定的格式去读取由空白符分隔的值保存到传递给本函数的参数中。
  • 本函数返回成功扫描的数据个数和遇到的任何错误。

代码示例如下:

func main() {var (name    stringage     intmarried bool)fmt.Scanf("1:%s 2:%d 3:%t", &name, &age, &married)fmt.Printf("扫描结果 name:%s age:%d married:%t \n", name, age, married)
}

将上面的代码编译后在终端执行,在终端按照指定的格式依次输入小王子28false

$ ./scan_demo
1:小王子 2:28 3:false
扫描结果 name:小王子 age:28 married:false

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

fmt.Scanln

函数签名如下:

func Scanln(a ...interface{}) (n int, err error)
  • Scanln类似Scan,它在遇到换行时才停止扫描。最后一个数据后面必须有换行或者到达结束位置。
  • 本函数返回成功扫描的数据个数和遇到的任何错误。

具体代码示例如下:

func main() {var (name    stringage     intmarried bool)fmt.Scanln(&name, &age, &married)fmt.Printf("扫描结果 name:%s age:%d married:%t \n", name, age, married)
}

将上面的代码编译后在终端执行,在终端依次输入小王子28false使用空格分隔。

$ ./scan_demo
小王子 28 false
扫描结果 name:小王子 age:28 married:false

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

文件操作

打开和关闭文件

os.Open()函数能够打开一个文件,返回一个*File和一个err。对得到的文件实例调用close()方法能够关闭文件。

//只读方式打开当前目录下的main.go文件file, err := os.Open("./main.go")if err != nil {fmt.Println("open fail:", err)return}//关闭文件file.Close()

为了防止文件忘记关闭,我们通常使用defer注册文件关闭语句。

读取文件
file.Read()

Read方法定义如下:

func (f *File) Read(b []byte) (n int, err error)

它接收一个字节切片,返回读取的字节数和可能的具体错误,读到文件末尾时会返回0io.EOF。 举个例子:

基本使用:

//只读方式打开当前目录下的main.go文件file, err := os.Open("./main.go")if err != nil {fmt.Println("打开文件失败", err)return}defer file.Close()//使用Read方法读取数据var tmp = make([]byte, 128)n, err := file.Read(tmp)if err == io.EOF {fmt.Println("文件读完了")return}if err != nil {fmt.Println("读取文件失败", err)return}fmt.Printf("读取了%d字节\n", n)fmt.Println(string(tmp[:n]))//运行结果
读取了128字节
package mainfunc main() {// fmtDemo()// fmtDemo2()// fmtDemo3()// fmtDemo4()// fmtDemo5()// fmtDemo6()// fileDem

循环读取:

//只读方式打开文件file, err := os.Open("./main.go")if err != nil {fmt.Println("打开文件失败", err)return}defer file.Close()//循环读取文件var content []bytevar tmp = make([]byte, 128)for {n, err := file.Read(tmp)if err != io.EOF {fmt.Println("文件读完了")break}if err != nil {fmt.Println("读取文件失败", err)return}content = append(content, tmp[:n]...)}fmt.Println(string(content))
bufio读取文件

bufio是在file的基础上封装了一层API,支持更多的功能。

逐行读取:

//bufio按行读取file, err := os.Open("./main.go")if err != nil {fmt.Println("打开文件失败", err)return}defer file.Close()reader := bufio.NewReader(file)for {line, err := reader.ReadString('\n') //注意是字符if err == io.EOF {if len(line) != 0 {fmt.Println(line)}fmt.Println("文件读完了")break}if err != nil {fmt.Println("读取文件失败", err)return}fmt.Print(line)}//运行结果
package mainfunc main() {// fmtDemo()// fmtDemo2()// fmtDemo3()// fmtDemo4()// fmtDemo5()// fmtDemo6()// fileDemo()// fileDemo2()// fileDemo3()fileDemo4()
}
文件读完了
ioutil读取整个文件

io/ioutil包的ReadFile方法能够读取完整的文件,只需要将文件名作为参数传入。

//iountil.ReadFile读取整个文件content, err := ioutil.ReadFile("./main.go")if err != nil {fmt.Println("读取文件失败", err)return}fmt.Println(string(content))
//运行结果
package mainfunc main() {// fmtDemo()// fmtDemo2()// fmtDemo3()// fmtDemo4()// fmtDemo5()// fmtDemo6()// fileDemo()// fileDemo2()// fileDemo3()// fileDemo4()fileDemo5()
}
文件写入操作

os.OpenFile()函数能够以指定模式打开文件,从而实现文件写入相关功能。

func OpenFile(name string, flag int, perm FileMode) (*File, error) {...
}

其中:

name:要打开的文件名 flag:打开文件的模式。 模式有以下几种:

模式 含义
os.O_WRONLY 只写
os.O_CREATE 创建文件
os.O_RDONLY 只读
os.O_RDWR 读写
os.O_TRUNC 清空
os.O_APPEND 追加

perm:文件权限,一个八进制数。r(读)04,w(写)02,x(执行)01。

Write和WriteString
file, err := os.OpenFile("xx.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)if err != nil {fmt.Println("打开文件失败", err)return}defer file.Close()str := "hellp 沙河"file.Write([]byte(str)) //写入字节切片数据file.WriteString(str)   //直接写入字符串数据
Buffo.NewWrite
file, err := os.OpenFile("./xx.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)if err != nil {fmt.Println("打开失败", err)return}defer file.Close()writer := bufio.NewWriter(file)for i := 0; i < 10; i++ {writer.WriteString("hellp 沙河小王总\n") //将数据写入缓存中}writer.Flush() //将数据写入文件中//运行结果
hellp 沙河小王总
hellp 沙河小王总
hellp 沙河小王总
hellp 沙河小王总
hellp 沙河小王总
hellp 沙河小王总
hellp 沙河小王总
hellp 沙河小王总
hellp 沙河小王总
hellp 沙河小王总
ioutil.WriteFile
str := "沙河小王子"err := ioutil.WriteFile("./xxx.txt", []byte(str), 0666)if err != nil {fmt.Println("写入文件失败", err)return}

11-标准库fmt以及文件操作相关推荐

  1. c/c++标准库中的文件操作总结

    1 stdio.h是c标准库中的标准输入输出库 2 在c++中调用的方法 直接调用即可,但是最好在函数名前面加上::,以示区分类的内部函数和c标准库函数. 3 c标准输入输出库的使用 3.1 核心结构 ...

  2. C++标准库实现WAV文件读写

    C++标准库实现WAV文件读写 在上一篇文章RIFF和WAVE音频文件格式中对WAV的文件格式做了介绍,本文将使用标准C++库实现对数据为PCM格式的WAV文件的读写操作,只使用标准C++库函数,不依 ...

  3. C++11标准库 - array 1

    C++11标准库 - array std::array是原生数组的封装,它存放于栈上且大小固定,性能也与之相同.在原生数组的基础上,它添加了范围检查,以及其它的STL的相应特性,比如复制.交换.迭代器 ...

  4. Python标准库判断图片文件和声音文件的格式

    每种文件都有自己独特的文件头结构和数据组织形式,这些都会在specification中进行详细说明和描述. GIF文件的头结构比较简单,前4个字节是GIF8,例如: 但是其他图片文件的结构就复杂很多了 ...

  5. 【C语言】标准库(头文件、静态库、动态库),windows与Linux平台下的常用C语言标准库

    一.Introduction 1.1 C语言标准库 1.2 历代C语言标准 1.3 主流C语言编译器 二.C语言标准库 2.1 常用标准头文件 2.2 常用标准静态库 三.windows平台 四.Li ...

  6. python标准库os的方法listdir_使用python标准库快速修改文件名字

    大家在追剧的时候会一次性下载很多电影,但是很烦人的是前面会有很多电影网站的广告前缀. 今天我将介绍一个简短的代码,快速修改这些文件的名字. 工具:os 首先在电影目录下新建一个py文件,并导入os i ...

  7. 聊聊C++11标准库中堆(heap)算法的源码

    STL中支持堆操作,对外暴露了std::make_heap,std::push_heap,std::pop_heap,std::sort_heap,std::is_heap,std::is_heap_ ...

  8. Linux学习笔记-标准库中的管道操作

    目录 理论 例子 理论 stdio.h里面有标志库管道操作 FILE *popen(const char* cmdstring, const char *type);返回值:成功返回文件指针,出错返回 ...

  9. 标准库 - fmt/format.go 解读

    // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a B ...

最新文章

  1. LNMP下提示File not found问题的解决方法
  2. Web Storage中的sessionStorage和localStorage
  3. 雅加达EE:干净的板岩
  4. 如何准备Java初级和高级技术的面试呢?
  5. vue框架+cesium项目怎么才能运行成功
  6. 多尺度图像增强Retinex相关算法学习及实现
  7. 解锁网易云音乐客户端变灰歌曲的详细教程
  8. leetcode blind 75
  9. 2019西安交大计算机专业研究生分数线,2019西安交通大学研究生分数线汇总(含2016-2019历年复试)...
  10. Matlab实现Taylor展开近似计算、五角星画法
  11. 华三交换机 流量镜像
  12. 使用计算机要遵循哪些规则,中国大学MOOC:\\\在计算机网络的定义中,把众多计算机有机连接起来要遵循规定的约定和规则,称之为( )。\\\;...
  13. 怨憎会、爱别离、求不得
  14. 韩寒郭敬明开启音乐精准营销时代
  15. 应用进程和内核的关系
  16. API网关:开源Apinto网关-应用管理篇
  17. Ubuntu 软件包管理利器 - 新立得 (Synaptic)
  18. 微信小程序-图片宽高设置
  19. 怎样把COFFEEscript 编译成JS
  20. computed原理

热门文章

  1. 【问题解决】MISCONF Redis is configured to save RDB snapshots, but it is currently not a
  2. cdr不显示缩略图怎么办呢?
  3. 免费直播!用Python开发人脸识别程序,零基础也能学(附源码)
  4. 45岁程序员精通各种技术体系,竟然连个面试机会都没有?
  5. zTree复选框案例
  6. C# 关于线程锁lock的使用方法
  7. 大数据运维到底是什么 又需要做些什么
  8. Linux安装与卸载JDK
  9. 小白必看!领英LinkedIn的个人商务会员和企业销售会员应该怎么选?
  10. java-抽象类和接口的区别