「Golang成长之路」标准库之fmt包 
                                                    
                        
                    
                    
  
                    
                    [toc]
文章介绍
学习每一门编程语言都应该将其常用标准库掌握,这样能使我们更好的使用编程语言,同时也避免了重复造轮子,学习标准库是很有必要的,fmt包实现了类似C语言printf和scanf的格式化I/O。这里我们主要分为向外输出内容和获取输入内容两大部分。
向外输出
标准库fmt提供了以下几种输出相关函数。
向外输出,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:8080Errorf
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篮球参考
本作品采用《CC 协议》,转载必须注明作者和本文链接
 
           iceymoss 的个人博客
 iceymoss 的个人博客
         
             
           
           关于 LearnKu
                关于 LearnKu
               
                     
                     
                     粤公网安备 44030502004330号
 粤公网安备 44030502004330号 
 
推荐文章: