首页 > 其他分享 >golang标准库之 fmt

golang标准库之 fmt

时间:2024-03-06 10:48:13浏览次数:25  
标签:name fmt 占位 golang 标准 func Printf main

目录

fmt

  • fmt包实现了类似C语言printf和scanf的格式化I/O。主要分为输出和获取输入两大部分

  • 和python的直接使用f-string不同的是,Go中的格式化输入和格式化输出,都需要先导fmt包后才能使用

1. 获取输入

  • 作用就是python中的input

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

(1)fmt.Scan(常用)

Scan的函数定义: func Scan(a ...interface{}) (n int, err error)

********Scan的返回值一般没啥用,通常不接收。注意:参数为变量地址********
Scan函数返回成功扫描的数据个数和遇到的任何错误。如果读取的数据个数比提供的参数少,会返回一个错误报告原因

********Scan 函数用 空格 和 回车 当作每个输入参数之间的间隔符 ,当回车时,若输入参数的个数不够,仍可以继续输入********


package main

import "fmt"

func main() {
	var (
		name    string
		age     int
		married bool
	)
	
    fmt.Print("请输入:")
	cnt, res := fmt.Scan(&name, &age, &married)  // 直接写成 fmt.Scan(&name, &age, &married) 就行,一般不用接收返回值
	fmt.Println("cnt,res", cnt, res)
	fmt.Printf("扫描结果 name:%s age:%d married:%t \n", name, age, married)
}

(2)fmt.Scanln(常用)

同上面的fmt.Scan用法一致,只有一点不同,就是fmt.Scanln方法,在输入参数时,只能以空格作为不同参数之间的间隔符,回车会直接结束输入

Scanln的函数定义: func Scanln(a ...interface{}) (n int, err error)

(3)fmt.Scanf

  • 格式化输入,必须与定义的输入内容格式一致,才能被接收
  • 在输入参数时,只能以空格作为不同参数之间的间隔符,回车会直接结束输入
package main

import "fmt"

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

/*

示例输入:  1:小王子 2:28 3:false

必须按照:1:参数1 2:参数2 3:参数3   来进行输入,且参数类型不能错误,可以漏输右边的部分,不能漏输左边的部分

1:参数1   // 参数1可以被接收到
1:参数1 2:参数2  // 参数1 参数2可以被接收到
2:参数2  // 参数2 不能被接收
*/

2. print、println、printf 输出

  • fmt.print、fmt.println、fmt.printf 三种
    • print就是普通的输出
    • println 会在输出内容的结尾添加一个换行符,即可以自动换行
    • printf 为格式化输出字符串,能识别各种占位符
函数定义:
func Print(a ...interface{}) (n int, err error)
func Println(a ...interface{}) (n int, err error)
func Printf(format string, a ...interface{}) (n int, err error)


简单示例:

package main

import "fmt"

func main() {
	fmt.Print("在终端打印该信息。")
	name := "沙河小王子"
	fmt.Printf("我是:%s\n", name)
	fmt.Println("在终端打印单独一行显示")
}

/*
在终端打印该信息。我是:沙河小王子
在终端打印单独一行显示
*/

3. Sprint(了解即可)

  • Sprint系列函数会把传入的数据生成并返回一个字符串
函数定义:
func Sprint(a ...interface{}) string
func Sprintf(format string, a ...interface{}) string
func Sprintln(a ...interface{}) string


简单示例:
package main

import "fmt"

func main() {
    s1 := fmt.Sprint("沙河小王子")
    name := "沙河小王子"
    age := 18
    s2 := fmt.Sprintf("name:%s,age:%d", name, age)
    s3 := fmt.Sprintln("沙河小王子")  // s3末尾因为Sprintln函数而多了一个换行符
    fmt.Println("1111")
    fmt.Print(s1, s2, s3)  // 这里我们没有换行,而下面的打印结果显示,换行打印了2222
    fmt.Println("2222")
}

/*
1111
沙河小王子name:沙河小王子,age:18沙河小王子
2222
*/

4. Errorf(了解即可)

  • Errorf函数根据format参数生成格式化字符串并返回一个包含该字符串的错误
函数定义: func Errorf(format string, a ...interface{}) error

通常使用这种方式来自定义错误类型,例如:

err := fmt.Errorf("这是一个错误")

5. 格式化占位符

  • 掌握常用的几个即可 %% %d %s %p %T %.nf (n为保留的小数个数),其他当作了解

(1)通用占位符

占位符 说明
%v 值的默认格式表示,将值格式化为一个更紧凑的表示形式
%+v 类似%v,但输出结构体时会添加字段名
%#v 值的Go语法表示
%T 打印值的类型
%% 百分号

(2)布尔型占位符

占位符 说明
%t true或false

(3)整型占位符

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

import "fmt"

func main() {
	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 
*/

(4)浮点数与复数占位符

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

import "fmt"

func main() {
	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  
*/

(5)字符串和[]byte占位符

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

import "fmt"

func main() {
	s := "王子"
	fmt.Printf("%s\n", s)
	fmt.Printf("%q\n", s)
	fmt.Printf("%x\n", s)
	fmt.Printf("%X\n", s)
}

/*
王子
"王子"      
e78e8be5ad90
E78E8BE5AD90
*/

(6)指针占位符

占位符 说明
%p 表示为十六进制,并加上前导的0x
%#p 表示为十六进制,不加上前导的0x
  • 示例
package main

import "fmt"

func main() {
	a := 10
	fmt.Printf("%p\n", &a)
	fmt.Printf("%#p\n", &a)
}

// 0xc00000a0d8
// c00000a0d8

(7)宽度标识符

  • 宽度通过一个紧跟在百分号后面的十进制数指定,如果未指定宽度,则表示值时除必需之外不作填充。精度通过(可选的)宽度后跟点号后跟的十进制数指定。如果未指定精度,会使用默认精度;如果点号后没有跟数字,表示精度为0。举例如下
  • 宽度可以理解为整型部分的长度,精度可以理解为小数的长度
占位符 说明
%f 默认宽度,默认精度
%9f 宽度9,默认精度
%.2f 默认宽度,精度2
%9.2f 宽度9,精度2
%9.f 宽度9,精度0
  • 示例
package main

import "fmt"

func main() {
	n := 12.34
	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)
}

/*
12.340000
12.340000
12.34    
    12.34
       12
*/

(8)其他

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

import "fmt"

func main() {
	s := "王子"
	fmt.Printf("%s\n", s)
	fmt.Printf("%5s\n", s)
	fmt.Printf("%-5s\n", s)
	fmt.Printf("%5.7s\n", s)
	fmt.Printf("%-5.7s\n", s)
	fmt.Printf("%5.2s\n", s)
	fmt.Printf("%05s\n", s)
}

/*
王子
   王子
王子   
   王子
王子   
   王子
000王子
*/

标签:name,fmt,占位,golang,标准,func,Printf,main
From: https://www.cnblogs.com/Mcoming/p/18055978

相关文章

  • golang标准库之 flag、strconv
    目录一、flag库1.flag的简单替代2.flag的参数类型3.flag参数的定义(1)flag.Type()(2)flag.TypeVar()4.flag解析命令行参数5.flag其他方法二、strconv库1.string转换为int类型2.int转换为string类型3.Parse系列函数(1)ParseBool()(2)ParseInt()(3)ParseUnit()(4)ParseFloat()(5)示例4.Fo......
  • golang标准库之 time
    目录time库1.时间类型2.时间戳(1)时间格式转化为时间戳(2)时间戳转换为时间格式3.时间间隔类型4.时间的操作(1)时间格式化(2)解析字符串类型的时间(3)时间加时间间隔(4)两个时间之差(5)时间是否相同(6)判断时间前后(7)定时器time库time库是Go语言内置的库,用来定义和操作时间、日期time.Sl......
  • golang进阶之结构体
    目录一、结构体(Go的面向对象)1.结构体的含义2.type关键字(1)自定义新类型(2)类型的别名(3)自定义类型和类型别名的区别二、结构体的定义三、结构体实例化1.基本实例化2.匿名结构体2.指针型结构体3.取结构体的地址实例化4.结构体指针进阶实例四、结构体的初始化1.未初始化的结构......
  • 标准日本语——第7课(练习2)
    1.在()中填入适当的词语。【例】昨日(何)を買いましたか。ーー車の雑誌を買いました。(1)(いつ)上海へ行きますか。ーー来週行きます。(2)毎日(何時)に起きますか。ーー6時半に起きます。(3)(だれ/どなた)と図書館へ行きますか。ーー小野さんと行きます。(4)駅へ(何)で......
  • STM32标准库基本定时器
    STM32标准库基本定时器1.定时器初始化voidTIM6_Init()//定时器6初始化{ TIM_TimeBaseInitTypeDefTIM_TimBaseStructure;//定义定时器结构体 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);//使能定时器6的时钟 TI......
  • C++ 简易STL 教程 与 C++ 标准库
    C++STL(标准模板库)是一套功能强大的C++模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。C++标准模板库的核心包括以下三个组件:组件描述容器(Containers)容器是用来管理某一类对象的集合。C++提供了各种不......
  • STM32标准库RTC时钟
    STM32标准库RTC时钟1.RTC时钟配置1.1头文件引用需要引用以下头文件或打开以下模块:#include"stm32f10x_rcc.h"//包含RCC时钟配置头文件#include"stm32f10x_pwr.h"//包含PWR时钟配置头文件#include"stm32f10x_rtc.h"//包含RTC时钟配置头文件#inclu......
  • Linux shell 标准输入(stdin)、标准输出(stdout)、标准错误输出(stderr)介绍
    Linux系统shell使用文件描述符0与进程的标准输入(一般是键盘)相关联,文件描述符1与标准输出(一般是显示器)相关联,文件描述符2与标准出错输出(一般是显示器)相关联。1、可以将/dev/null看作"黑洞".它非常等价于一个只写文件.所有写入它的内容都会永远丢失.而尝试从它那儿读取内容则什......
  • PDF标准详解(二)——PDF 对象
    上一篇文章我们介绍了一个PDF文档应该包含的最基本的结构,并且手写了一个最简单的“HelloWorld”的PDF文档。后面我们介绍新的PDF标准给出示例时将以这个文档为基础,而不再给出完整的文档示例,小伙伴想自己测试可以根据上一节的文档来进行配置。对象上一节我们看到一个个奇奇怪......
  • 一文搞懂 Go 1.21 的日志标准库 - slog
    一文搞懂Go1.21的日志标准库-slog原创 rubys_ awk 2024-01-3120:20 广东 1人听过在过去多年里,我们在Go中写日志的时候,通常都是使用 Zerolog 或者 Zap 这两个包。在本文中,我们将重点探讨Go最近引入的 log/slog 包,该包旨在将高性能、结构化和分级日志......