Print() 函数将参数列表 a 中的各个参数转换为字符串并写入到标准输出中。

非字符串参数之间会添加空格,返回写入的字节数。

  1. func Print(a ...interface{}) (n int, err error)

Println() 函数功能类似 Print,只不过最后会添加一个换行符。

所有参数之间会添加空格,返回写入的字节数。

  1. func Println(a ...interface{}) (n int, err error)

Printf() 函数将参数列表 a 填写到格式字符串 format 的占位符中。

填写后的结果写入到标准输出中,返回写入的字节数。

  1. func Printf(format string, a ...interface{}) (n int, err error)
  1. 以下三个函数功能同上面三个函数,只不过将转换结果写入到 w 中。
  1. func Fprint(w io.Writer, a ...interface{}) (n int, err error)
  2. func Fprintln(w io.Writer, a ...interface{}) (n int, err error)
  3. func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)

以下三个函数功能同上面三个函数,只不过将转换结果以字符串形式返回。

  1. func Sprint(a ...interface{}) string
  2. func Sprintln(a ...interface{}) string
  3. func Sprintf(format string, a ...interface{}) string

以下函数功能同 Sprintf() 函数,只不过结果字符串被包装成了 error 类型。

  1. func Errorf(format string, a ...interface{}) error

实例:

  1. func main() {
  2. fmt.Print("a", "b", , , , "c", "d", "\n")
  3. fmt.Println("a", "b", , , , "c", "d")
  4. fmt.Printf("ab %d %d %d cd\n", , , )
  5. // ab1 2 3cd
  6. // a b 1 2 3 c d
  7. // ab 1 2 3 cd
  8.  
  9. if err := percent(, , , ); err != nil {
  10. fmt.Println(err)
  11. }
  12. // 30%
  13. // 70%
  14. // 90%
  15. // 数值 160 超出范围(100)
  16. }
  1. func percent(i ...int) error {
  2. for _, n := range i {
  3. if n > {
  4. return fmt.Errorf("数值 %d 超出范围(100)", n)
  5. }
  6. fmt.Print(n, "%\n")
  7. }
  8. return nil
  9. }
  1.  

Formatter 由自定义类型实现,用于实现该类型的自定义格式化过程。

当格式化器需要格式化该类型的变量时,会调用其 Format 方法。

  1. type Formatter interface {
  2. // f 用于获取占位符的旗标、宽度、精度等信息,也用于输出格式化的结果
  3. // c 是占位符中的动词
  4. Format(f State, c rune)
  5. }

由格式化器(Print 之类的函数)实现,用于给自定义格式化过程提供信息:

  1. type State interface {
  2. // Formatter 通过 Write 方法将格式化结果写入格式化器中,以便输出。
  3. Write(b []byte) (ret int, err error)
  4. // Formatter 通过 Width 方法获取占位符中的宽度信息及其是否被设置。
  5. Width() (wid int, ok bool)
  6. // Formatter 通过 Precision 方法获取占位符中的精度信息及其是否被设置。
  7. Precision() (prec int, ok bool)
  8. // Formatter 通过 Flag 方法获取占位符中的旗标[+- 0#]是否被设置。
  9. Flag(c int) bool
  10. }

Stringer 由自定义类型实现,用于实现该类型的自定义格式化过程。

当格式化器需要输出该类型的字符串格式时就会调用其 String 方法。

  1. type Stringer interface {
  2. String() string
  3. }

Stringer 由自定义类型实现,用于实现该类型的自定义格式化过程。

当格式化器需要输出该类型的 Go 语法字符串(%#v)时就会调用其 String 方法。

  1. type GoStringer interface {
  2. GoString() string
  3. }

实例:

  1. type Ustr string
  2.  
  3. func (us Ustr) String() string {
  4. return strings.ToUpper(string(us))
  5. }
  6.  
  7. func (us Ustr) GoString() string {
  8. return `"` + strings.ToUpper(string(us)) + `"`
  9. }
  10.  
  11. func (u Ustr) Format(f fmt.State, c rune) {
  12. write := func(s string) {
  13. f.Write([]byte(s))
  14. }
  15. switch c {
  16. case 'm', 'M':
  17. write("旗标:[")
  18. for s := "+- 0#"; len(s) > ; s = s[:] {
  19. if f.Flag(int(s[])) {
  20. write(s[:])
  21. }
  22. }
  23. write("]")
  24. if v, ok := f.Width(); ok {
  25. write(" | 宽度:" + strconv.FormatInt(int64(v), ))
  26. }
  27. if v, ok := f.Precision(); ok {
  28. write(" | 精度:" + strconv.FormatInt(int64(v), ))
  29. }
  30. case 's', 'v': // 如果使用 Format 函数,则必须自己处理所有格式,包括 %#v
  31. if c == 'v' && f.Flag('#') {
  32. write(u.GoString())
  33. } else {
  34. write(u.String())
  35. }
  36. default: // 如果使用 Format 函数,则必须自己处理默认输出
  37. write("无效格式:" + string(c))
  38. }
  39. }
  40.  
  41. func main() {
  42. u := Ustr("Hello World!")
  43. // "-" 标记和 "0" 标记不能同时存在
  44. fmt.Printf("%-+ 0#8.5m\n", u) // 旗标:[+- #] | 宽度:8 | 精度:5
  45. fmt.Printf("%+ 0#8.5M\n", u) // 旗标:[+ 0#] | 宽度:8 | 精度:5
  46. fmt.Println(u) // HELLO WORLD!
  47. fmt.Printf("%s\n", u) // HELLO WORLD!
  48. fmt.Printf("%#v\n", u) // "HELLO WORLD!"
  49. fmt.Printf("%d\n", u) // 无效格式:d
  50. }

Scan 从标准输入中读取数据,并将数据用空白分割并解析后存入 a 提供的变量中(换行符会被当作空白处理),变量必须以指针传入。

当读到 EOF 或所有变量都填写完毕则停止扫描。

返回成功解析的参数数量。

  1. func Scan(a ...interface{}) (n int, err error)
  1. Scanln  Scan 类似,只不过遇到换行符就停止扫描。
  1. func Scanln(a ...interface{}) (n int, err error)
  1. Scanf 从标准输入中读取数据,并根据格式字符串 format 对数据进行解析,将解析结果存入参数 a 所提供的变量中,变量必须以指针传入。

输入端的换行符必须和 format 中的换行符相对应(如果格式字符串中有换行符,则输入端必须输入相应的换行符)。

占位符 %c 总是匹配下一个字符,包括空白,比如空格符、制表符、换行符。

返回成功解析的参数数量。

  1. func Scanf(format string, a ...interface{}) (n int, err error)
  1. 以下三个函数功能同上面三个函数,只不过从 r 中读取数据。
  1. func Fscan(r io.Reader, a ...interface{}) (n int, err error)
  2. func Fscanln(r io.Reader, a ...interface{}) (n int, err error)
  3. func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error)

以下三个函数功能同上面三个函数,只不过从 str 中读取数据。

  1. func Sscan(str string, a ...interface{}) (n int, err error)
  2. func Sscanln(str string, a ...interface{}) (n int, err error)
  3. func Sscanf(str string, format string, a ...interface{}) (n int, err error)

实例:

  1. // 对于 Scan 而言,回车视为空白
  2. func main() {
  3. a, b, c := "", , false
  4. fmt.Scan(&a, &b, &c)
  5. fmt.Println(a, b, c)
  6. // 在终端执行后,输入 abc 1 回车 true 回车
  7. // 结果 abc 1 true
  8. }
  9.  
  10. // 对于 Scanln 而言,回车结束扫描
  11. func main() {
  12. a, b, c := "", , false
  13. fmt.Scanln(&a, &b, &c)
  14. fmt.Println(a, b, c)
  15. // 在终端执行后,输入 abc 1 true 回车
  16. // 结果 abc 1 true
  17. }
  18.  
  19. // 格式字符串可以指定宽度
  20. func main() {
  21. a, b, c := "", , false
  22. fmt.Scanf("%4s%d%t", &a, &b, &c)
  23. fmt.Println(a, b, c)
  24. // 在终端执行后,输入 1234567true 回车
  25. // 结果 1234 567 true
  26. }

Scanner 由自定义类型实现,用于实现该类型的自定义扫描过程。

当扫描器需要解析该类型的数据时,会调用其 Scan 方法。

  1. type Scanner interface {
  2. // state 用于获取占位符中的宽度信息,也用于从扫描器中读取数据进行解析。
  3. // verb 是占位符中的动词
  4. Scan(state ScanState, verb rune) error
  5. }

由扫描器(Scan 之类的函数)实现,用于给自定义扫描过程提供数据和信息。

  1. type ScanState interface {
  2. // ReadRune 从扫描器中读取一个字符,如果用在 Scanln 类的扫描器中,
  3. // 则该方法会在读到第一个换行符之后或读到指定宽度之后返回 EOF。
  4. // 返回“读取的字符”和“字符编码所占用的字节数”
  5. ReadRune() (r rune, size int, err error)
  6. // UnreadRune 撤消最后一次的 ReadRune 操作,
  7. // 使下次的 ReadRune 操作得到与前一次 ReadRune 相同的结果。
  8. UnreadRune() error
  9. // SkipSpace 为 Scan 方法提供跳过开头空白的能力。
  10. // 根据扫描器的不同(Scan 或 Scanln)决定是否跳过换行符。
  11. SkipSpace()
  12. // Token 用于从扫描器中读取符合要求的字符串,
  13. // Token 从扫描器中读取连续的符合 f(c) 的字符 c,准备解析。
  14. // 如果 f 为 nil,则使用 !unicode.IsSpace(c) 代替 f(c)。
  15. // skipSpace:是否跳过开头的连续空白。返回读取到的数据。
  16. // 注意:token 指向共享的数据,下次的 Token 操作可能会覆盖本次的结果。
  17. Token(skipSpace bool, f func(rune) bool) (token []byte, err error)
  18. // Width 返回占位符中的宽度值以及宽度值是否被设置
  19. Width() (wid int, ok bool)
  20. // 因为上面实现了 ReadRune 方法,所以 Read 方法永远不应该被调用。
  21. // 一个好的 ScanState 应该让 Read 直接返回相应的错误信息。
  22. Read(buf []byte) (n int, err error)
  23. }

实例:

  1. type Ustr string
  2.  
  3. func (u *Ustr) Scan(state fmt.ScanState, verb rune) (err error) {
  4. var s []byte
  5. switch verb {
  6. case 'S':
  7. s, err = state.Token(true, func(c rune) bool { return 'A' <= c && c <= 'Z' })
  8. if err != nil {
  9. return
  10. }
  11. case 's', 'v':
  12. s, err = state.Token(true, func(c rune) bool { return 'a' <= c && c <= 'z' })
  13. if err != nil {
  14. return
  15. }
  16. default:
  17. return fmt.Errorf("无效格式:%c", verb)
  18. }
  19. *u = Ustr(s)
  20. return nil
  21. }
  22.  
  23. func main() {
  24. var a, b, c, d, e Ustr
  25. n, err := fmt.Scanf("%3S%S%3s%2v%x", &a, &b, &c, &d, &e)
  26. fmt.Println(a, b, c, d, e)
  27. fmt.Println(n, err)
  28. // 在终端执行后,输入 ABCDEFGabcdefg 回车
  29. // 结果:
  30. // ABC DEFG abc de
  31. // 4 无效格式:x
  32. }

换个语言学一下 Golang(14) ——fmt包的更多相关文章

  1. 换个语言学一下 Golang (11)——使用包和测试

    Go天生就是为了支持良好的项目管理体验而设计的. 包 在软件工程的实践中,我们会遇到很多功能重复的代码,比如去除字符串首尾的空格.高质量软件产品的特点就是它的部分代码是可以重用的,比如你不必每次写个函 ...

  2. 『GoLang』fmt包的使用

    目录 1. fmt 包初识 2. 格式化 verb 应用 2.1 通用 2.2 布尔值 2.3 整数 2.4 浮点数与复数 2.5 字符串和 []byte 2.6 指针 2.7 其他 flag 2.8 ...

  3. 换个语言学一下 Golang (7)——使用函数

    什么是函数 函数,简单来讲就是一段将输入数据转换为输出数据的公用代码块.当然有的时候函数的返回值为空,那么就是说输出数据为空.而真正的处理过程在函数内部已经完成了. 想一想我们为什么需要函数,最直接的 ...

  4. 换个语言学一下 Golang (1)

    做技术的总是有些拗.这么多年一直在.net的框框里打转转.直到现在市场上.net工作越来越难找,项目越来越老才发现不做出改变不行了.就从学习Go开始吧. Go语言的特点 简洁.快速.安全 并行.有趣. ...

  5. 换个语言学一下 Golang (13)——Web表单处理

    介绍 表单是我们平常编写Web应用常用的工具,通过表单我们可以方便的让客户端和服务器进 行数据的交互.对于以前开发过Web的用户来说表单都非常熟悉.表单是一个包含表单元素的区域.表单元素是允许用户在表 ...

  6. 换个语言学一下 Golang (12)——Web基础

    一.web工作方式 我们平时浏览网页的时候,会打开浏览器,输入网址后按下回车键,然后就会显示出你想要浏览的内容.在这个看似简单的用户行为背后,到底隐藏了些什么呢?对于普通的上网过程,系统其实是这样做的 ...

  7. 换个语言学一下 Golang (3)——数据类型

    在 Go 编程语言中,数据类型用于声明函数和变量. 数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存. Go 语言按类别有以下几种 ...

  8. 换个语言学一下 Golang (4)——变量与常量

    一.变量定义 所谓的变量就是一个拥有指定名称和类型的数据存储位置. //看一个例子 package main import ( "fmt" ) func main() { var ...

  9. 换个语言学一下 Golang (2)——基础语法

    Go 标记 Go 程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号.比如下面的hello world就是由 6 个标记组成: 行分隔符 在 Go 程序中,一行代表一个语句结束.每个语句 ...

随机推荐

  1. django orm 基于双下划线的跨表查询

    一..基于双下划线的跨表查询(join实现) key:正向查询按字段,反向查询按表明小写 1.一对多跨表查询 查询在跨表中可以有两种方式,正向查询就是关键字段在你要搜索的表,没有关键字段就是反向查询 ...

  2. opencart 3伪静态seo url设置教程

    opencart 3已经为我们做好了url伪静态功能,我们只要做一些简单的设置就能实现seo url,首先开启伪静态功能,看看文件.htaccess事发后有存在如下规则,如果没有需要先添加下面的代码 ...

  3. mobx 学习笔记

    Mobx 笔记 Mobx 三板斧,observable.observer.action. observable: 通过 observable(state) 定义组件的状态,包装后的状态是一个可观察数据 ...

  4. Ubuntu18.04安装redis-server启动出错

    虽然报错原因可能是 redis-server.service: Can't open PID file /var/run/redis/re Aug 26 15:43:25 iZ2ze6ddwhet60 ...

  5. scannet数据集

    数据集包含xyz和label信息,不包含颜色信息. 一共1513个室内场景数据(每个场景中点云数量都不一样),共21个类别的对象(0-20,总共已知类别应该是20,类别0应该是未知类别,即未标注点云) ...

  6. bootstrap基础自我总结

    *今天自学了一些封装的css,看起来官网很强大,但是因为源码备注都是英文的情况下,还是感觉想深入有点力不从心,发现度娘没有中文手册,无奈,不过还好代码无国界,基本都是能看懂的,备注也影响不大(安慰自己 ...

  7. 【字符串】【P5830】 【模板】失配树

    [字符串][P5830] [模板]失配树 Description 给定一个长度为 \(n\) 的字符串 \(S\),有 \(m\) 次询问,每次询问给定 \(S\) 的两个前缀,求它们的最长公共 bo ...

  8. day 18

    Only through experience of trial and suffering can the soul be strengthened, vision cleared, ambitio ...

  9. matplotlib 柱状图

    222 # coding utf-8 # import matplotlib import numpy as np import matplotlib.pyplot as plt import mat ...

  10. 第10组 Beta冲刺(2/4)

    队名:凹凸曼 组长博客 作业博客 组员实践情况 童景霖 过去两天完成了哪些任务 文字/口头描述 编写商品主界面 展示GitHub当日代码/文档签入记录 暂无代码 接下来的计划 编写购买功能 还剩下哪些 ...