golang 中fmt用法

2024-05-14 02:48
文章标签 golang 用法 fmt

本文主要是介绍golang 中fmt用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

golang 中fmt用法

chenbaoke · 2014-10-10 15:00:01 · 47888 次点击 · 预计阅读时间 8 分钟 · 2分钟之前 开始浏览    

这是一个创建于 2014-10-10 15:00:01 的文章,其中的信息可能已经有所发展或是发生改变。

fmt 包中的函数和方法



本文转自Golang学习-fmt包:
http://www.cnblogs.com/golove/p/3286303.html



// format.go

------------------------------------------------------------

// Fprintf 将参数列表 a 填写到格式字符串 format 的占位符中
// 并将填写后的结果写入 w 中,返回写入的字节数
func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)

// Printf 将参数列表 a 填写到格式字符串 format 的占位符中
// 并将填写后的结果写入 os.Stdout 中,返回写入的字节数
func Printf(format string, a ...interface{}) (n int, err error)

// Sprintf 将参数列表 a 填写到格式字符串 format 的占位符中
// 返回填写后的结果
func Sprintf(format string, a ...interface{}) string

// Errorf 将参数列表 a 填写到格式字符串 format 的占位符中
// 并将填写后的结果转换为 error 类型返回
func Errorf(format string, a ...interface{}) error

------------------------------------------------------------

// Fprint 将参数列表 a 中的各个参数转换为字符串格式并写入到 w 中
// 各个参数之间以空格分隔,返回写入的字节数
func Fprint(w io.Writer, a ...interface{}) (n int, err error)

// Print 将参数列表 a 中的各个参数转换为字符串格式并写入到 os.Stdout 中
// 各个参数之间以空格分隔,返回写入的字节数
func Print(a ...interface{}) (n int, err error)

// Sprint 将参数列表 a 中的各个参数转换为字符串格式并返回
// 各个参数之间以空格分隔
func Sprint(a ...interface{}) string

------------------------------------------------------------

// Fprintln 在 Fprint 的基础上,再向 w 中写入一个换行符
func Fprintln(w io.Writer, a ...interface{}) (n int, err error)

// Println 在 Print 的基础上,再向 os.Stdout 中写入一个换行符
func Println(a ...interface{}) (n int, err error)

// Sprintln 在 Sprint 的基础上,在返回值的最后添加一个换行符
func Sprintln(a ...interface{}) string

------------------------------------------------------------

// 示例
func main() {
fmt.Fprintf(os.Stdout, "%08b\n", 32) // 00100000
fmt.Printf("%08b\n", 32) // 00100000
fmt.Print(fmt.Sprintf("%08b\n", 32)) // 00100000
fmt.Print(fmt.Errorf("%08b\n", 32)) // 00100000

fmt.Fprint(os.Stdout, "A")
fmt.Print("B")
fmt.Print(fmt.Sprint("C"))
// ABC

fmt.Print("\n")

fmt.Fprintln(os.Stdout, "A") // A
fmt.Println("B") // B
fmt.Print(fmt.Sprintln("C")) // C
}

------------------------------------------------------------

// Formatter 用于实现对象的自定义格式输出
type Formatter interface {
// Format 用来处理当对象遇到 c 标记时的输出方式(c 相当于 %s 中的 s)
// f 用来获取占位符的宽度、精度、扩展标记等信息,同时实现最终的输出
// c 是要处理的标记
Format(f State, c rune)
}

// State 用来获取占位符的状态,包括宽度、精度、扩展标记等信息
// 同时实现格式化后的字符串的输出
type State interface {
// Write 用于将格式化后的字符串输出到指定的对象
// 根据 Print 函数(Fprintf,Printf,Sprintf)的不同,输出到不同的地方
Write(b []byte) (ret int, err error)
// Width 返回占位符的宽度值(wid)和宽度是否被设置(ok)
Width() (wid int, ok bool)
// Precision 返回占位符的精度值(prec)和精度是否被设置(ok)
Precision() (prec int, ok bool)
// Flag 返回扩展标记 c(一个字符,比如 %#s 中的 #)是否已被设置
Flag(c int) bool
}

type Stringer interface {
// String 获取对象的文本形式
String() string
}

type GoStringer interface {
// GoString 获取对象的 Go 语法文本形式(以 %#v 格式输出的文本)
GoString() string
}

------------------------------------------------------------

// 示例
type Ustr string

func (us Ustr) String() string {
return string(us) + " 自定义格式"
}

func (us Ustr) GoString() string {
return string(us) + " Go 格式"
}

func (us Ustr) Format(f fmt.State, c rune) {
switch c {
case 'm', 'M':
f.Write([]byte(us + "\n扩展标记:["))
if f.Flag('-') {
f.Write([]byte(" -"))
}
if f.Flag('+') {
f.Write([]byte(" +"))
}
if f.Flag('#') {
f.Write([]byte(" #"))
}
if f.Flag(' ') {
f.Write([]byte(" space"))
}
if f.Flag('0') {
f.Write([]byte(" 0"))
}
f.Write([]byte(" ]\n"))
if w, wok := f.Width(); wok {
f.Write([]byte("宽度值:" + fmt.Sprint(w) + "\n"))
}
if p, pok := f.Precision(); pok {
f.Write([]byte("精度值:" + fmt.Sprint(p)))
}
case 'v': // 如果使用 Format 函数,则必须自己处理所有格式,包括 %#v
if f.Flag('#') {
f.Write([]byte(us.GoString()))
} else {
f.Write([]byte(us.String()))
}
default: // 如果使用 Format 函数,则必须自己处理默认输出
f.Write([]byte(us.String()))
}
}

func main() {
us := Ustr("Hello World!")
fmt.Printf("% 0-+#8.5m\n", us)
// Hello World!
// 扩展标记:[ - + # space 0 ]
// 宽度值:8
// 精度值:5
fmt.Println(us)
// Hello World! 自定义格式
fmt.Printf("%#v\n", us)
// Hello World! Go 格式
}



============================================================



// scan.go

------------------------------------------------------------

// Fscanf 用于扫描 r 中的数据,并根据 format 指定的格式
// 将扫描出的数据填写到参数列表 a 中
// 当 r 中的数据被全部扫描完毕或扫描长度超出 format 指定的长度时
// 则停止扫描(换行符会被当作空格处理)
func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error)

func main() {
s := strings.NewReader("我的名字叫 Golang ,今年 4 岁")
var name string
var age int
// 注意:这里必须传递指针 &name, &age
// 要获取的数据前后必须有空格
fmt.Fscanf(s, "我的名字叫 %s ,今年 %d 岁", &name, &age)
fmt.Printf("%s %d", name, age)
// Golang 4
}

// Scanf 用于扫描 os.Stdin 中的数据,并根据 format 指定的格式
// 将扫描出的数据填写到参数列表 a 中
// 当 r 中的数据被全部扫描完毕或者扫描长度超出 format 指定的长度时
// 则停止扫描(换行符会被当作空格处理)
func Scanf(format string, a ...interface{}) (n int, err error)

func main() {
var name string
var age int
// 注意:这里必须传递指针 &name, &age
// 要获取的数据前后必须有空格
fmt.Scanf("%s %d", &name, &age)
// 在控制台输入:Golang 4
fmt.Printf("我的名字叫 %s ,今年 %d 岁", name, age)
// 我的名字叫 Golang ,今年 4 岁
}

// Sscanf 用于扫描 str 中的数据,并根据 format 指定的格式
// 将扫描出的数据填写到参数列表 a 中
// 当 r 中的数据被全部扫描完毕或者扫描长度超出 format 指定的长度时
// 则停止扫描(换行符会被当作空格处理)
func Sscanf(str string, format string, a ...interface{}) (n int, err error)

func main() {
s := "我的名字叫 Golang ,今年 4 岁"
var name string
var age int
// 注意:这里必须传递指针 &name, &age
// 要获取的数据前后必须有空格
fmt.Sscanf(s, "我的名字叫 %s ,今年 %d 岁", &name, &age)
fmt.Printf("%s %d", name, age)
// Golang 4
}

------------------------------------------------------------

// Fscan 用于扫描 r 中的数据,并将数据以空格为分割符进行分割
// 然后填写到参数列表 a 中
// 当 r 中的数据被全部扫描完毕或者参数列表 a 被全部填写完毕
// 则停止扫描(换行符会被当作空格处理)
func Fscan(r io.Reader, a ...interface{}) (n int, err error)

// Scan 用于扫描 os.Stdin 中的数据,并将数据以空格为分割符进行分割
// 然后填写到参数列表 a 中
// 当 r 中的数据被全部扫描完毕或者参数列表 a 被全部填写完毕
// 则停止扫描(换行符会被当作空格处理)
func Scan(a ...interface{}) (n int, err error)

// Sscan 用于扫描 str 中的数据,并将数据以空格为分割符进行分割
// 然后填写到参数列表 a 中
// 当 r 中的数据被全部扫描完毕或者参数列表 a 被全部填写完毕
// 则停止扫描(换行符会被当作空格处理)
func Sscan(str string, a ...interface{}) (n int, err error)

------------------------------------------------------------

// Fscanln 用于扫描 r 中的数据,并将数据以空格为分割符进行分割
// 然后填写到参数列表 a 中
// 当扫描过程中遇到 '\n' 或者参数列表 a 被全部填写完毕
// 则停止扫描
func Fscanln(r io.Reader, a ...interface{}) (n int, err error)

// Scanln 用于扫描 os.Stdin 中的数据,并将数据以空格为分割符进行分割
// 然后填写到参数列表 a 中
// 当扫描过程中遇到 '\n' 或者参数列表 a 被全部填写完毕
// 则停止扫描
func Scanln(a ...interface{}) (n int, err error)

// Sscanln 用于扫描 str 中的数据,并将数据以空格为分割符进行分割
// 然后填写到参数列表 a 中
// 当扫描过程中遇到 '\n' 或者参数列表 a 被全部填写完毕
// 则停止扫描
func Sscanln(str string, a ...interface{}) (n int, err error)

------------------------------------------------------------

// ScanState 会返回扫描状态给自定义的 Scanner
// Scanner 可能会做字符的实时扫描
// 或者通过 ScanState 获取以空格分割的 token
type ScanState interface {
// ReadRune 从输入对象中读出一个 Unicode 字符
// 如果在 Scanln、Fscanln 或 Sscanln 中调用该方法
// 该方法会在遇到 '\n' 或读取超过指定的宽度时返回 EOF
ReadRune() (r rune, size int, err error)
// UnreadRune 撤消最后一次的 ReadRune 操作
UnreadRune() error
// SkipSpace 跳过输入数据中的空格
// 在 Scanln、Fscanln、Sscanln 操作中,换行符会被当作 EOF
// 在其它 Scan 操作中,换行符会被当作空格
SkipSpace()
// 如果参数 skipSpace 为 true,则 Token 会跳过输入数据中的空格
// 然后返回满足函数 f 的连续字符,如果 f 为 nil,则使用 !unicode.IsSpace 来代替 f
// 在 Scanln、Fscanln、Sscanln 操作中,换行符会被当作 EOF
// 在其它 Scan 操作中,换行符会被当作空格
// 返回的 token 是一个切片,返回的数据可能在下一次调用 Token 的时候被修改
Token(skipSpace bool, f func(rune) bool) (token []byte, err error)
// Width 返回宽度值以及宽度值是否被设置
Width() (wid int, ok bool)
// 因为 ReadRune 已经通过接口实现,所以 Read 可能永远不会被 Scan 例程调用
// 一个 ScanState 的实现,可能会选择废弃 Read 方法,而使其始终返回一个错误信息
Read(buf []byte) (n int, err error)
}

// Scanner 用于实现对象的自定义格式扫描
type Scanner interface {
// Scan 用来处理当对象遇到 c 标记时的扫描方式(c 相当于 %s 中的 s)
// state 用来处理扫描状态
// c 是要处理的标记
Scan(state ScanState, verb rune) error
}

这篇关于golang 中fmt用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/987544

相关文章

golang版本升级如何实现

《golang版本升级如何实现》:本文主要介绍golang版本升级如何实现问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录golanwww.chinasem.cng版本升级linux上golang版本升级删除golang旧版本安装golang最新版本总结gola

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

golang中reflect包的常用方法

《golang中reflect包的常用方法》Go反射reflect包提供类型和值方法,用于获取类型信息、访问字段、调用方法等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录reflect包方法总结类型 (Type) 方法值 (Value) 方法reflect包方法总结

解读GC日志中的各项指标用法

《解读GC日志中的各项指标用法》:本文主要介绍GC日志中的各项指标用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基础 GC 日志格式(以 G1 为例)1. Minor GC 日志2. Full GC 日志二、关键指标解析1. GC 类型与触发原因2. 堆

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景