换个语言学一下 Golang(14) ——fmt包
Print() 函数将参数列表 a 中的各个参数转换为字符串并写入到标准输出中。
非字符串参数之间会添加空格,返回写入的字节数。
- func Print(a ...interface{}) (n int, err error)
Println() 函数功能类似 Print,只不过最后会添加一个换行符。
所有参数之间会添加空格,返回写入的字节数。
- func Println(a ...interface{}) (n int, err error)
Printf() 函数将参数列表 a 填写到格式字符串 format 的占位符中。
填写后的结果写入到标准输出中,返回写入的字节数。
- func Printf(format string, a ...interface{}) (n int, err error)
- 以下三个函数功能同上面三个函数,只不过将转换结果写入到 w 中。
- func Fprint(w io.Writer, a ...interface{}) (n int, err error)
- func Fprintln(w io.Writer, a ...interface{}) (n int, err error)
- func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)
以下三个函数功能同上面三个函数,只不过将转换结果以字符串形式返回。
- func Sprint(a ...interface{}) string
- func Sprintln(a ...interface{}) string
- func Sprintf(format string, a ...interface{}) string
以下函数功能同 Sprintf() 函数,只不过结果字符串被包装成了 error 类型。
- func Errorf(format string, a ...interface{}) error
实例:
- func main() {
- fmt.Print("a", "b", , , , "c", "d", "\n")
- fmt.Println("a", "b", , , , "c", "d")
- fmt.Printf("ab %d %d %d cd\n", , , )
- // ab1 2 3cd
- // a b 1 2 3 c d
- // ab 1 2 3 cd
- if err := percent(, , , ); err != nil {
- fmt.Println(err)
- }
- // 30%
- // 70%
- // 90%
- // 数值 160 超出范围(100)
- }
- func percent(i ...int) error {
- for _, n := range i {
- if n > {
- return fmt.Errorf("数值 %d 超出范围(100)", n)
- }
- fmt.Print(n, "%\n")
- }
- return nil
- }
Formatter 由自定义类型实现,用于实现该类型的自定义格式化过程。
当格式化器需要格式化该类型的变量时,会调用其 Format 方法。
- type Formatter interface {
- // f 用于获取占位符的旗标、宽度、精度等信息,也用于输出格式化的结果
- // c 是占位符中的动词
- Format(f State, c rune)
- }
由格式化器(Print 之类的函数)实现,用于给自定义格式化过程提供信息:
- type State interface {
- // Formatter 通过 Write 方法将格式化结果写入格式化器中,以便输出。
- Write(b []byte) (ret int, err error)
- // Formatter 通过 Width 方法获取占位符中的宽度信息及其是否被设置。
- Width() (wid int, ok bool)
- // Formatter 通过 Precision 方法获取占位符中的精度信息及其是否被设置。
- Precision() (prec int, ok bool)
- // Formatter 通过 Flag 方法获取占位符中的旗标[+- 0#]是否被设置。
- Flag(c int) bool
- }
Stringer 由自定义类型实现,用于实现该类型的自定义格式化过程。
当格式化器需要输出该类型的字符串格式时就会调用其 String 方法。
- type Stringer interface {
- String() string
- }
Stringer 由自定义类型实现,用于实现该类型的自定义格式化过程。
当格式化器需要输出该类型的 Go 语法字符串(%#v)时就会调用其 String 方法。
- type GoStringer interface {
- GoString() string
- }
实例:
- type Ustr string
- func (us Ustr) String() string {
- return strings.ToUpper(string(us))
- }
- func (us Ustr) GoString() string {
- return `"` + strings.ToUpper(string(us)) + `"`
- }
- func (u Ustr) Format(f fmt.State, c rune) {
- write := func(s string) {
- f.Write([]byte(s))
- }
- switch c {
- case 'm', 'M':
- write("旗标:[")
- for s := "+- 0#"; len(s) > ; s = s[:] {
- if f.Flag(int(s[])) {
- write(s[:])
- }
- }
- write("]")
- if v, ok := f.Width(); ok {
- write(" | 宽度:" + strconv.FormatInt(int64(v), ))
- }
- if v, ok := f.Precision(); ok {
- write(" | 精度:" + strconv.FormatInt(int64(v), ))
- }
- case 's', 'v': // 如果使用 Format 函数,则必须自己处理所有格式,包括 %#v
- if c == 'v' && f.Flag('#') {
- write(u.GoString())
- } else {
- write(u.String())
- }
- default: // 如果使用 Format 函数,则必须自己处理默认输出
- write("无效格式:" + string(c))
- }
- }
- func main() {
- u := Ustr("Hello World!")
- // "-" 标记和 "0" 标记不能同时存在
- fmt.Printf("%-+ 0#8.5m\n", u) // 旗标:[+- #] | 宽度:8 | 精度:5
- fmt.Printf("%+ 0#8.5M\n", u) // 旗标:[+ 0#] | 宽度:8 | 精度:5
- fmt.Println(u) // HELLO WORLD!
- fmt.Printf("%s\n", u) // HELLO WORLD!
- fmt.Printf("%#v\n", u) // "HELLO WORLD!"
- fmt.Printf("%d\n", u) // 无效格式:d
- }
Scan 从标准输入中读取数据,并将数据用空白分割并解析后存入 a 提供的变量中(换行符会被当作空白处理),变量必须以指针传入。
当读到 EOF 或所有变量都填写完毕则停止扫描。
返回成功解析的参数数量。
- func Scan(a ...interface{}) (n int, err error)
- Scanln 和 Scan 类似,只不过遇到换行符就停止扫描。
- func Scanln(a ...interface{}) (n int, err error)
- Scanf 从标准输入中读取数据,并根据格式字符串 format 对数据进行解析,将解析结果存入参数 a 所提供的变量中,变量必须以指针传入。
输入端的换行符必须和 format 中的换行符相对应(如果格式字符串中有换行符,则输入端必须输入相应的换行符)。
占位符 %c 总是匹配下一个字符,包括空白,比如空格符、制表符、换行符。
返回成功解析的参数数量。
- func Scanf(format string, a ...interface{}) (n int, err error)
- 以下三个函数功能同上面三个函数,只不过从 r 中读取数据。
- func Fscan(r io.Reader, a ...interface{}) (n int, err error)
- func Fscanln(r io.Reader, a ...interface{}) (n int, err error)
- func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error)
以下三个函数功能同上面三个函数,只不过从 str 中读取数据。
- func Sscan(str string, a ...interface{}) (n int, err error)
- func Sscanln(str string, a ...interface{}) (n int, err error)
- func Sscanf(str string, format string, a ...interface{}) (n int, err error)
实例:
- // 对于 Scan 而言,回车视为空白
- func main() {
- a, b, c := "", , false
- fmt.Scan(&a, &b, &c)
- fmt.Println(a, b, c)
- // 在终端执行后,输入 abc 1 回车 true 回车
- // 结果 abc 1 true
- }
- // 对于 Scanln 而言,回车结束扫描
- func main() {
- a, b, c := "", , false
- fmt.Scanln(&a, &b, &c)
- fmt.Println(a, b, c)
- // 在终端执行后,输入 abc 1 true 回车
- // 结果 abc 1 true
- }
- // 格式字符串可以指定宽度
- func main() {
- a, b, c := "", , false
- fmt.Scanf("%4s%d%t", &a, &b, &c)
- fmt.Println(a, b, c)
- // 在终端执行后,输入 1234567true 回车
- // 结果 1234 567 true
- }
Scanner 由自定义类型实现,用于实现该类型的自定义扫描过程。
当扫描器需要解析该类型的数据时,会调用其 Scan 方法。
- type Scanner interface {
- // state 用于获取占位符中的宽度信息,也用于从扫描器中读取数据进行解析。
- // verb 是占位符中的动词
- Scan(state ScanState, verb rune) error
- }
由扫描器(Scan 之类的函数)实现,用于给自定义扫描过程提供数据和信息。
- type ScanState interface {
- // ReadRune 从扫描器中读取一个字符,如果用在 Scanln 类的扫描器中,
- // 则该方法会在读到第一个换行符之后或读到指定宽度之后返回 EOF。
- // 返回“读取的字符”和“字符编码所占用的字节数”
- ReadRune() (r rune, size int, err error)
- // UnreadRune 撤消最后一次的 ReadRune 操作,
- // 使下次的 ReadRune 操作得到与前一次 ReadRune 相同的结果。
- UnreadRune() error
- // SkipSpace 为 Scan 方法提供跳过开头空白的能力。
- // 根据扫描器的不同(Scan 或 Scanln)决定是否跳过换行符。
- SkipSpace()
- // Token 用于从扫描器中读取符合要求的字符串,
- // Token 从扫描器中读取连续的符合 f(c) 的字符 c,准备解析。
- // 如果 f 为 nil,则使用 !unicode.IsSpace(c) 代替 f(c)。
- // skipSpace:是否跳过开头的连续空白。返回读取到的数据。
- // 注意:token 指向共享的数据,下次的 Token 操作可能会覆盖本次的结果。
- Token(skipSpace bool, f func(rune) bool) (token []byte, err error)
- // Width 返回占位符中的宽度值以及宽度值是否被设置
- Width() (wid int, ok bool)
- // 因为上面实现了 ReadRune 方法,所以 Read 方法永远不应该被调用。
- // 一个好的 ScanState 应该让 Read 直接返回相应的错误信息。
- Read(buf []byte) (n int, err error)
- }
实例:
- type Ustr string
- func (u *Ustr) Scan(state fmt.ScanState, verb rune) (err error) {
- var s []byte
- switch verb {
- case 'S':
- s, err = state.Token(true, func(c rune) bool { return 'A' <= c && c <= 'Z' })
- if err != nil {
- return
- }
- case 's', 'v':
- s, err = state.Token(true, func(c rune) bool { return 'a' <= c && c <= 'z' })
- if err != nil {
- return
- }
- default:
- return fmt.Errorf("无效格式:%c", verb)
- }
- *u = Ustr(s)
- return nil
- }
- func main() {
- var a, b, c, d, e Ustr
- n, err := fmt.Scanf("%3S%S%3s%2v%x", &a, &b, &c, &d, &e)
- fmt.Println(a, b, c, d, e)
- fmt.Println(n, err)
- // 在终端执行后,输入 ABCDEFGabcdefg 回车
- // 结果:
- // ABC DEFG abc de
- // 4 无效格式:x
- }
换个语言学一下 Golang(14) ——fmt包的更多相关文章
- 换个语言学一下 Golang (11)——使用包和测试
Go天生就是为了支持良好的项目管理体验而设计的. 包 在软件工程的实践中,我们会遇到很多功能重复的代码,比如去除字符串首尾的空格.高质量软件产品的特点就是它的部分代码是可以重用的,比如你不必每次写个函 ...
- 『GoLang』fmt包的使用
目录 1. fmt 包初识 2. 格式化 verb 应用 2.1 通用 2.2 布尔值 2.3 整数 2.4 浮点数与复数 2.5 字符串和 []byte 2.6 指针 2.7 其他 flag 2.8 ...
- 换个语言学一下 Golang (7)——使用函数
什么是函数 函数,简单来讲就是一段将输入数据转换为输出数据的公用代码块.当然有的时候函数的返回值为空,那么就是说输出数据为空.而真正的处理过程在函数内部已经完成了. 想一想我们为什么需要函数,最直接的 ...
- 换个语言学一下 Golang (1)
做技术的总是有些拗.这么多年一直在.net的框框里打转转.直到现在市场上.net工作越来越难找,项目越来越老才发现不做出改变不行了.就从学习Go开始吧. Go语言的特点 简洁.快速.安全 并行.有趣. ...
- 换个语言学一下 Golang (13)——Web表单处理
介绍 表单是我们平常编写Web应用常用的工具,通过表单我们可以方便的让客户端和服务器进 行数据的交互.对于以前开发过Web的用户来说表单都非常熟悉.表单是一个包含表单元素的区域.表单元素是允许用户在表 ...
- 换个语言学一下 Golang (12)——Web基础
一.web工作方式 我们平时浏览网页的时候,会打开浏览器,输入网址后按下回车键,然后就会显示出你想要浏览的内容.在这个看似简单的用户行为背后,到底隐藏了些什么呢?对于普通的上网过程,系统其实是这样做的 ...
- 换个语言学一下 Golang (3)——数据类型
在 Go 编程语言中,数据类型用于声明函数和变量. 数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存. Go 语言按类别有以下几种 ...
- 换个语言学一下 Golang (4)——变量与常量
一.变量定义 所谓的变量就是一个拥有指定名称和类型的数据存储位置. //看一个例子 package main import ( "fmt" ) func main() { var ...
- 换个语言学一下 Golang (2)——基础语法
Go 标记 Go 程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号.比如下面的hello world就是由 6 个标记组成: 行分隔符 在 Go 程序中,一行代表一个语句结束.每个语句 ...
随机推荐
- django orm 基于双下划线的跨表查询
一..基于双下划线的跨表查询(join实现) key:正向查询按字段,反向查询按表明小写 1.一对多跨表查询 查询在跨表中可以有两种方式,正向查询就是关键字段在你要搜索的表,没有关键字段就是反向查询 ...
- opencart 3伪静态seo url设置教程
opencart 3已经为我们做好了url伪静态功能,我们只要做一些简单的设置就能实现seo url,首先开启伪静态功能,看看文件.htaccess事发后有存在如下规则,如果没有需要先添加下面的代码 ...
- mobx 学习笔记
Mobx 笔记 Mobx 三板斧,observable.observer.action. observable: 通过 observable(state) 定义组件的状态,包装后的状态是一个可观察数据 ...
- Ubuntu18.04安装redis-server启动出错
虽然报错原因可能是 redis-server.service: Can't open PID file /var/run/redis/re Aug 26 15:43:25 iZ2ze6ddwhet60 ...
- scannet数据集
数据集包含xyz和label信息,不包含颜色信息. 一共1513个室内场景数据(每个场景中点云数量都不一样),共21个类别的对象(0-20,总共已知类别应该是20,类别0应该是未知类别,即未标注点云) ...
- bootstrap基础自我总结
*今天自学了一些封装的css,看起来官网很强大,但是因为源码备注都是英文的情况下,还是感觉想深入有点力不从心,发现度娘没有中文手册,无奈,不过还好代码无国界,基本都是能看懂的,备注也影响不大(安慰自己 ...
- 【字符串】【P5830】 【模板】失配树
[字符串][P5830] [模板]失配树 Description 给定一个长度为 \(n\) 的字符串 \(S\),有 \(m\) 次询问,每次询问给定 \(S\) 的两个前缀,求它们的最长公共 bo ...
- day 18
Only through experience of trial and suffering can the soul be strengthened, vision cleared, ambitio ...
- matplotlib 柱状图
222 # coding utf-8 # import matplotlib import numpy as np import matplotlib.pyplot as plt import mat ...
- 第10组 Beta冲刺(2/4)
队名:凹凸曼 组长博客 作业博客 组员实践情况 童景霖 过去两天完成了哪些任务 文字/口头描述 编写商品主界面 展示GitHub当日代码/文档签入记录 暂无代码 接下来的计划 编写购买功能 还剩下哪些 ...