「Golang成长之路」标准库之fmt包

[toc]

文章介绍#

学习每一门编程语言都应该将其常用标准库掌握,这样能使我们更好的使用编程语言,同时也避免了重复造轮子,学习标准库是很有必要的,fmt 包实现了类似 C 语言 printf 和 scanf 的格式化 I/O。这里我们主要分为向外输出内容和获取输入内容两大部分。

向外输出#

标准库 fmt 提供了以下几种输出相关函数。

Print#

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

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)

下面来看实例:

fmt.Print("吃饭了嘛?")
name := "iceymoss"
fmt.Printf("%s吃饭了吗\n", name)
fmt.Println("吃饭了嘛?")

输出:

吃饭了嘛?iceymoss吃饭了吗
吃饭了嘛?

Fprint#

Fprint 系列函数会将内容输出到一个 io.Writer 接口类型的变量 w 中,我们通常用这个函数往文件中写入内容。这里需要注意:只要满足 io.Writer 接口的类型都支持写入

方法定义:

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

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

接下来看实例:

//os.Stdout:标准输出  os.Stdin:标准输入
fmt.Fprint(os.Stdout, "向标准输出中写入内容")
fileOpj, err := os.OpenFile("learn_fmt/test.txt", os.O_WRONLY, 0466)
    if err != nil {
        fmt.Println("打开文件出错,err:", err)
        return
}
name := "iceymoss"
fmt.Fprintf(fileOpj, "姓名:%s", name)

控制台输出:

向标准输出中写入内容

然后对应的 txt 文件:

姓名:iceymoss

实例 2:

func RredAndWrite(){
  //读文件,读取为字符串
    str, err := os.ReadFile("learn_fmt/test.txt")
    if err != nil {
        panic(err)
    }

    fmt.Println(string(str))

  //创建文件
    file, err := os.Create("text2.txt")
    if err != nil {
        panic(err)
    }

  //将读取到的字符串写入创建的文件中
    fmt.Fprintf(file, string(str))
}

Sprint#

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

方法定义:

func Sprintln(a ...interface{}) string

func Sprint(a ...interface{}) string

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

来看实例:

gender := fmt.Sprintln("男")
name := fmt.Sprint("iceymoss")
ip := fmt.Sprintf("%s:%d", "127.0.0.1", 8080)
fmt.Print(gender, name, ip)

输出:

男
iceymoss127.0.0.1:8080

Errorf#

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

方法定义:

func Errorf(format string, a ...interface{}) error

实例:

err := fmt.Errorf("这是一个%s", "错误")
    if err != nil {
    fmt.Println("错误:", err)
  return
}

输出:

错误: 这是一个错误

格式化占位符#

通用占位符#

占位符 说明
%v 值的默认格式表示
%+v 类似 % v,但输出结构体时会添加字段名
%#v 值的 Go 语法表示
%T 打印值的类型
%% 百分号
fmt.Printf("%v\n", 100)
fmt.Printf("%v\n", false)
o := struct{ name string }{"iceymoss"}
fmt.Printf("%v\n", o)
fmt.Printf("%#v\n", o)
fmt.Printf("%T\n", o)
fmt.Printf("100%%\n")

输出:

100
false
{iceymoss}
struct { name string }{name:"iceymoss"}
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 := 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

浮点数与复数#

占位符 说明
%b 无小数部分、二进制指数的科学计数法,如 - 123456p-78
%e 科学计数法,如 - 1234.456e+78
%E 科学计数法,如 - 1234.456E+78
%f 有小数部分但无指数部分,如 123.456
%F 等价于 % f
%g 根据实际情况采用 % e 或 % f 格式(以获得更简洁、准确的输出)
%G 根据实际情况采用 % E 或 % F 格式(以获得更简洁、准确的输出)

实例代码:

f := 12.34
fmt.Printf("%b\n", f)
fmt.Printf("%e\n", f)
fmt.Printf("%E\n", f)
fmt.Printf("%f\n", f)
fmt.Printf("%g\n", f)
fmt.Printf("%G\n", f)

输出:

6946802425218990p-49
1.234000e+01
1.234000E+01
12.340000
12.34
12.34

字符串和 [] 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)

输出:

淦饭
"淦饭"
e6b7a6e9a5ad
E6B7A6E9A5AD

指针#

占位符 说明
%p 表示为十六进制,并加上前导的 0x

实例代码:

a := 18
fmt.Printf("%p\n", &a)
fmt.Printf("%#p\n", &a)

输出:

0xc00001e108
c00001e108

宽度标识符#

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

占位符 说明
%f 默认宽度,默认精度
%9f 宽度 9,默认精度
%.2f 默认宽度,精度 2
%9.2f 宽度 9,精度 2
%9.f 宽度 9,精度 0

示例代码如下:

n := 88.88
fmt.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)

输出结果如下:

    88.880000
    88.880000
    88.88
        88.88
           89

基本输入#

Scan#

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

方法定义:

func Scan(a ...interface{}) (n int, err error)

该方法默认如何的参数以空格为界,回车键结束输入。

实例代码:

var(
        name string
        age int
        gender string
    )
fmt.Scan(&name, &age, &gender)
fmt.Printf("扫描结果 name:%s age:%d married:%t \n", name, age, gender)

输出:

iceymoss 18 男 
扫描结果 name:iceymoss age:18 married:%!t(string=) 

实例:

var(
        name string
        age int
        gender string
)
fmt.Scanf("1:%s, 2:%d, 3:%s", &name, &age, &gender)
fmt.Printf("%s, %d, %s",name, age, gender)

实例:

//fmt.Scanln遇到回车就结束扫描了,这个比较常用。
var(
        name string
        age int
        gender string
)
fmt.Scanln( &name, &age, &gender)
fmt.Printf("%s, %d, %s",name, age, gender)

实例:

func ScanTest(){
    fmt.Println("请输入您的年龄:")
    var age int
    fmt.Scan(&age)
    for age < 18 {
        fmt.Println("您的年龄不合适进入网吧")
        fmt.Println("有请下一位")
        fmt.Println("请输入您的年龄:")
        fmt.Scan(&age)

    }
    fmt.Printf("欢迎光临!")
}

其他#

有时候我们想完整获取输入的内容,而输入的内容可能包含空格,这种情况下可以使用 bufio 包来实现。

实例代码:

func bufioDemo() {
    //os.Stdin 标准输入
    reader := bufio.NewReader(os.Stdin) // 从标准输入生成读对象
    fmt.Print("请输入内容:")
    text, _ := reader.ReadString('\n') // 读到换行
    text = strings.TrimSpace(text)  //返回字符串 s 的一部分,删除了所有前导和尾随空格
    fmt.Printf("%#v\n", text)
}

输出:

请输入内容:我喜欢唱跳rap篮球
我喜欢唱跳rap篮球

参考#

go 常用标准库

本作品采用《CC 协议》,转载必须注明作者和本文链接
刻意学习
未填写
文章
123
粉丝
105
喜欢
193
收藏
281
排名:338
访问:2.8 万
私信
所有博文
社区赞助商