Golang 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", 1, 2, 3, "c", "d", "\n")

fmt.Println("a", "b", 1, 2, 3, "c", "d")

fmt.Printf("ab %d %d %d cd\n", 1, 2, 3)

// ab1 2 3cd

// a b 1 2 3 c d

// ab 1 2 3 cd

if err := percent(30, 70, 90, 160); err != nil {

fmt.Println(err)

}

// 30%

// 70%

// 90%

// 数值 160 超出范围(100)

}

func percent(i ...int) error {

for _, n := range i {

if n > 100 {

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) > 0; s = s[1:] {

if f.Flag(int(s[0])) {

write(s[:1])

}

}

write("]")

if v, ok := f.Width(); ok {

write(" | 宽度:" + strconv.FormatInt(int64(v), 10))

}

if v, ok := f.Precision(); ok {

write(" | 精度:" + strconv.FormatInt(int64(v), 10))

}

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 := "", 0, false

fmt.Scan(&a, &b, &c)

fmt.Println(a, b, c)

// 在终端执行后,输入 abc 1 回车 true 回车

// 结果 abc 1 true

}

// 对于 Scanln 而言,回车结束扫描

func main() {

a, b, c := "", 0, false

fmt.Scanln(&a, &b, &c)

fmt.Println(a, b, c)

// 在终端执行后,输入 abc 1 true 回车

// 结果 abc 1 true

}

// 格式字符串可以指定宽度

func main() {

a, b, c := "", 0, 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

}

FCA

FCA

429***240967@qq.com3年前 (2018-07-21)

html go语言,Go 语言基础语法相关推荐

  1. Scala语言学习一——基础语法

    什么是 Scala Scala 是一种多范式的编程语言, 其设计的初衷是要集成面向对象编程和函数式编程的各种 特 性 . Scala 运 行 于 Java 平 台 (Java 虚 拟 机 ) , 并 ...

  2. salesforce.com开发平台 Apex语言介绍 (一.基础语法介绍)

    概要 Salesforce.com 的Apex语言是在Salesforce.com平台上执行的一种强类型编程语言.Apex被用作添加应用程序的业务逻辑(Business Logic),开发数据库触发器 ...

  3. Python语言学习系列------基础语法(一)

    本博客系列为自己按照网上视频教学学习python的一个随笔系列文章,也不知道会更新到多少,反正闲开个坑呗. 一.高级语言的分类 高级的编程语言分为解释型语言和编译型语言,两者的区别是主要是:在执行前是 ...

  4. python语言的语法_Python语言学习系列------基础语法(一)

    本博客系列为自己按照网上视频教学学习python的一个随笔系列文章,也不知道会更新到多少,反正闲开个坑呗. 一.高级语言的分类 高级的编程语言分为解释型语言和编译型语言,两者的区别是主要是:在执行前是 ...

  5. C语言的一些基础语法

    时至今日,我接触简单的C语言基础也才不过两个月左右的时间,也只是从头到尾完整地看完了一本讲C语言语法的书,期间看到后面也花费了一些时间去复习巩固之间的知识,所以我所了解的C语言也还是简简单单地停留在最 ...

  6. 面向对象的程序设计C++课堂复盘总结 C语言复习+C++基础语法

    Stay Hungry,Stay Foolish. 任何人都能写出机器能看懂的代码,但只有优秀的程序员才能写出人能看懂的代码. 有两种写程序的方式:一种是把代码写得非常复杂,以至于 "看不出 ...

  7. Hive数据定义语言-DDL-建表基础语法(含四个实践案例)

    1. 概述 数据定义语言DDL,是SQL语言集中对数据库内部的对象结构进行创建.删除.修改等的操作语言,这些数据库对象包括database.table.view.index等. DDL核心语法由CRE ...

  8. Go语言笔记—Go基础语法(2)

    目录 基本数据类型 布尔型 数字型 整形 浮点型 字符和字符串 数据类型转换 运算符 算术运算符 关系运算符 逻辑运算符 位运算符(二进制) 赋值运算符 其他运算符 拓展:键盘输入输出 编码规范 为什 ...

  9. C语言发展史和基础语法介绍(基础篇)

    文章目录 前言 什么是C语言? C语言简介 发展史 语言特点 主要特点 特有特点 缺点 变量与常量 变量 什么是变量? 作用域 生命周期 全局变量 局部变量 常量 什么是常量? 字面常量 cosnt修 ...

  10. python语言入门n-Python基础语法学习笔记

    一.内存管理 变量在动态语言中,无须事先声明,也不需要制定类型: 编程中一般无须关心变量的存亡,也不需要关心内存的管理: Python使用"引用计数"记录所有对象的引用数 当对象引 ...

最新文章

  1. java生成二维码/java解析二维码
  2. 如何设计登录接口,十分钟内连续登录5次失败,需要等待30分钟才能登录
  3. 自己动手写js分享插件 [支持https] (QQ空间,微信,新浪微博。。。)
  4. 在mysql-workbench中运行set和declare并且观察区别
  5. net程序员的iPhone开发-MonoTouch
  6. 前端学习(342):进制只能介于2-36之间Uncaught RangeError: toString() radix argumen
  7. python 生成器_Python生成器中的GeneratorExit
  8. php 学习笔记之搭建开发环境(mac版)
  9. iOS底层探索之LLVM(三)——自定义Clang插件(下)
  10. Maven无法下载com.oracle:ojdbc14:jar解决方法
  11. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十四:SD卡模块
  12. QT安装 and VS2019中安装QT插件
  13. 360全景虚拟现实图片拍摄的注意细节
  14. 国赛数学建模——北理工校赛1
  15. 2014腾讯实习生招聘武汉试题
  16. mysql migration 使用_DbMigration的使用方法
  17. 【AVL】宠物收养所
  18. java计算机毕业设计Vue垃圾分类指南平台设计与实现源码+数据库+系统+lw文档
  19. Away3D4.0入门教程
  20. 常用的函数:atoi,itoa,atof,_ttoi等

热门文章

  1. 如何用python计算函数的值域_用Python解数独[3]:求总值域
  2. Math详解大全,数学类
  3. linux 打开cgm软件,cgm文件扩展名,cgm文件怎么打开?
  4. 10个技巧帮你搞定IE 6
  5. 【MySQL】Could not initialize master info structure
  6. android 技术点记录
  7. 基于JSP+SERVLET的新闻发布系统(一)
  8. 【原】oracle11g 客户端安装检测失败问题
  9. plc算法相关论文参考
  10. NeHe OpenGL第九课:移动图像