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

相关文章

bytes.split的用法和注意事项

当然,我很乐意详细介绍 bytes.Split 的用法和注意事项。这个函数是 Go 标准库中 bytes 包的一个重要组成部分,用于分割字节切片。 基本用法 bytes.Split 的函数签名如下: func Split(s, sep []byte) [][]byte s 是要分割的字节切片sep 是用作分隔符的字节切片返回值是一个二维字节切片,包含分割后的结果 基本使用示例: pa

UVM:callback机制的意义和用法

1. 作用         Callback机制在UVM验证平台,最大用处就是为了提高验证平台的可重用性。在不创建复杂的OOP层次结构前提下,针对组件中的某些行为,在其之前后之后,内置一些函数,增加或者修改UVM组件的操作,增加新的功能,从而实现一个环境多个用例。此外还可以通过Callback机制构建异常的测试用例。 2. 使用步骤         (1)在UVM组件中内嵌callback函

这些ES6用法你都会吗?

一 关于取值 取值在程序中非常常见,比如从对象obj中取值 const obj = {a:1b:2c:3d:4} 吐槽: const a = obj.a;const b = obj.b;const c = obj.c;//或者const f = obj.a + obj.b;const g = obj.c + obj.d; 改进:用ES6解构赋值

Golang进程权限调度包runtime

关于 runtime 包几个方法: Gosched:让当前线程让出 cpu 以让其它线程运行,它不会挂起当前线程,因此当前线程未来会继续执行GOMAXPROCS:设置最大的可同时使用的 CPU 核数Goexit:退出当前 goroutine(但是defer语句会照常执行)NumGoroutine:返回正在执行和排队的任务总数GOOS:目标操作系统NumCPU:返回当前系统的 CPU 核数量 p

Golang 网络爬虫框架gocolly/colly(五)

gcocolly+goquery可以非常好地抓取HTML页面中的数据,但碰到页面是由Javascript动态生成时,用goquery就显得捉襟见肘了。解决方法有很多种: 一,最笨拙但有效的方法是字符串处理,go语言string底层对应字节数组,复制任何长度的字符串的开销都很低廉,搜索性能比较高; 二,利用正则表达式,要提取的数据往往有明显的特征,所以正则表达式写起来比较简单,不必非常严谨; 三,使

Golang网络爬虫框架gocolly/colly(四)

爬虫靠演技,表演得越像浏览器,抓取数据越容易,这是我多年爬虫经验的感悟。回顾下个人的爬虫经历,共分三个阶段:第一阶段,09年左右开始接触爬虫,那时由于项目需要,要访问各大国际社交网站,Facebook,myspace,filcker,youtube等等,国际上叫得上名字的社交网站都爬过,大部分网站提供restful api,有些功能没有api,就只能用http抓包工具分析协议,自己爬;国内的优酷、

Golang网络爬虫框架gocolly/colly(三)

熟悉了《Golang 网络爬虫框架gocolly/colly 一》和《Golang 网络爬虫框架gocolly/colly 二》之后就可以在网络上爬取大部分数据了。本文接下来将爬取中证指数有限公司提供的行业市盈率。(http://www.csindex.com.cn/zh-CN/downloads/industry-price-earnings-ratio) 定义数据结构体: type Zhj

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑

Golang服务平滑重启

与重载配置相同的是我们也需要通过信号来通知server重启,但关键在于平滑重启,如果只是简单的重启,只需要kill掉,然后再拉起即可。平滑重启意味着server升级的时候可以不用停止业务。 我们先来看下Github上有没有相应的库解决这个问题,然后找到了如下三个库: facebookgo/grace - Graceful restart & zero downtime deploy for G

Golang test编译使用

创建文件my_test.go package testsimport "testing"func TestMy(t *testing.T) {t.Log("TestMy")} 通常用法: $ go test -v -run TestMy my_test.go=== RUN TestMyTestMy: my_test.go:6: TestMy--- PASS: TestMy (0.