go ---fmt
//main
package main import (
"fmt"
"os"
) type Data struct {
} func (self Data) String() string {
return "data"
}
func main() {
fmt.Printf("hello,world\n")
fmt.Println("hi", 2, "sary")
fmt.Printf("%d\n", 10)
str := fmt.Sprintf("float %f\n", 3.14159)
fmt.Print(str)
fmt.Fprintln(os.Stdout, "hi")
fmt.Printf("%v\n", Data{}) }
输出:
hello,world hi 2 sary 10 float 3.141590 hi data
// 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
}
go ---fmt的更多相关文章
- fmt标签把时间戳格式化日期
jsp页面标签格式化日期 <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="f" %> ...
- springmvc:jsp fmt标签格式化Date时间,格式化后可以用于页面展示
java后台的对象时间参数是date类型,在前端想格式化,又是放在input输入框中的 先引入jstl标签库 <%@taglib uri="http://java.sun.com/js ...
- fmt 标签格式化 日期
<td class='center'> <fmt:formatDate value="${RecordMail.SendTime }" pattern=" ...
- JSTL中的fmt标签小例子
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...
- JSTL中fmt标签详解
一:JSTL格式化标签又称为I18N标签库,主要用来编写国际化的WEB应用,使用此功能可以对一个特定的语言请求做出合适的处理. 例如:中国内地用户将显示简体中文,台湾地区则显示繁体中文,使用I18N格 ...
- <fmt:formatDate>标签的输出格式:
<fmt:formatDate>标签的输出格式: d 月中的某一天.一位数的日期没有前导零. dd 月中的某一天.一位数的日期有一个前导零. ddd 周中 ...
- Jsp页显示时间标签JSTL标签 <fmt:formatDate/> 实例大全
<fmt:formatDate value="${isoDate}" type="both"/>2004-5-31 23:59:59 <fmt ...
- html 特殊字符 fmt table A
html 特殊字符 “&”表示“&” “ ”表示空格 <fmt:bundle basename=""> basename制定配置文件的文件名,无须扩展名 ...
- 【GoLang】GoLang fmt 占位符详解
golang 的fmt 包实现了格式化I/O函数,类似于C的 printf 和 scanf. # 定义示例类型和变量 type Human struct { Name string } var peo ...
- [原创]java WEB学习笔记52:国际化 fmt 标签,国际化的总结
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
随机推荐
- Coffee Break
题目链接:Coffee Break Gym-101911A 题目大意:有一位员工想要利用喝咖啡来休息,他给了一个数组表示他想要喝咖啡的时间点(假设他喝咖啡用时1分钟),老板规定每次喝咖啡的时间间隔必 ...
- P3396 哈希冲突(思维+方块)
题目 P3396 哈希冲突 做法 预处理模数\([1,\sqrt{n}]\)的内存池,\(O(n\sqrt{n})\) 查询模数在范围里则直接输出,否则模拟\(O(m\sqrt{n})\) 修改则遍历 ...
- Spring Boot 配置文件 bootstrap vs application 到底有什么区别?
用过 Spring Boot 的都知道在 Spring Boot 中有以下两种配置文件 bootstrap (.yml 或者 .properties) application (.yml 或者 .pr ...
- MySQL 自动插入、更新时间戳
在 MySql 中,要做到自动出入当前时间戳,只要在定义表格时将字段的默认值设置为 CURRENT_TIMESTAMP 即可. 如: create table if not exists my_tab ...
- edusoho上传视频弹出abort之解决方案
错误描述:edusoho上传如avi.mp4等容量大的图片(如100m以上或500m等)弹出abort提示框 原因:是因为web服务器apache默认上传文件有限制导致的 解决办法如下: (1)首先修 ...
- hadoop大作业
1.数据准备 2.把CSV添加到/bigdatacase/dataset中 3.检查前5行并删除第一行 4.将csv文件导入hadoop并检查前10行数据情况 5.数据文件导入hive 6.在Hive ...
- [代码质量] Git统计本次提交新增代码行数,建议每个评审commit新增行数小于400行
git log HEAD~1..HEAD --author="$(git config --get user.name)" --pretty=tformat: --numstat ...
- func 传参异步方法
public async Task<T> AssignAsync<T>(string key, Func<T> acquire) {} var result = a ...
- C++实现委托机制(三)——lambda表达式封装
C++.引言: 其实原本没打算写这一章的,不过最后想了想,嗯还是把lambda表达式也一并封装进去,让这个委托也适应lambda表达式的注册.不过在之前还是需要先了解lamb ...
- shell 判断一个字符串是否由字母数字组成
摘自:http://blog.51cto.com/lynnteng0/804520 describe="it's a describe by yourself" if echo & ...