设为首页 收藏本站
查看: 1182|回复: 0

[经验分享] Golang学习 - fmt 包

[复制链接]

尚未签到

发表于 2018-9-19 12:24:05 | 显示全部楼层 |阅读模式
------------------------------------------------------------  

  
// 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() (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,>  
// 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() (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'

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-594262-1-1.html 上篇帖子: golang internals 下篇帖子: Golang学习 - strconv 包
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表