|
|
51CTO旗下网站
|
|
移动端

9.2.4 Printf和反射

《Go语言编程入门与实战技巧》第9章接口与反射,本章需要注意设计类型时确认类型的本质是原始的还是非原始的。接口是声明了一组行为并支持多态的类型,嵌入类型提供了扩展类型的能力,而无须使用继承。本节为大家介绍Printf和反射。

作者:黄靖钧来源:电子工业出版社|2018-09-23 09:40

9.2.4  Printf和反射

在Go语言的标准库中,前面所述的反射的功能被大量地使用。举个例子,fmt包中的Printf(以及其他格式化输出函数)都会使用反射来分析它的...参数。Printf的函数声明为:

  1. func Printf(format string, args ... interface{}) (n int, err error) 

Printf中的...参数为空接口类型,Printf使用反射包来解析这个参数列表,所以,Printf能够知道它每个参数的类型。格式化字符串中只有%d而没有%u和%ld,因为它知道这个参数是unsigned还是long,这也是为什么Print和Println在没有格式字符串的情况下还能如此准确地输出。

为了让大家更加具体地了解Printf中的反射,下面实现一个简单的通用输出函数,其中使用了type-switch来推导参数类型,并根据类型来输出每个参数的值:

  1. // 示例代码9-10  
  2. package main  
  3.  
  4. import (  
  5.     "os"  
  6.     "strconv"  
  7. )  
  8.  
  9. type Stringer interface {  
  10.     String() string  
  11. }  
  12.  
  13. type Celsius float64  
  14.  
  15. func (c Celsius) String() string {  
  16.     return strconv.FormatFloat(float64(c),'f', 1, 64) + " °C"  
  17. }  
  18.  
  19. type Day int  
  20.  
  21. var dayName = []string{"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"}  
  22.  
  23. func (day Day) String() string {  
  24.     return dayName[day]  
  25. }  
  26.  
  27. func print(args ...interface{}) {  
  28.     for i, arg :range args {  
  29.         if i > 0 {os.Stdout.WriteString(" ")}  
  30.         switch a :arg.(type) { // 类型转换  
  31.             case Stringer:  os.Stdout.WriteString(a.String())  
  32.             case int:       os.Stdout.WriteString(strconv.Itoa(a))  
  33.             case string:    os.Stdout.WriteString(a)  
  34.             // 更多类型  
  35.             default:        os.Stdout.WriteString("???")  
  36.         }  
  37.     }  
  38. }  
  39.  
  40. func main() {  
  41.     print(Day(1), "温度是", Celsius(18.36))  // 星期二 温度是 18.4 °C  
  42. }  

在标准库的章节还会阐释fmt.Fprintf()是怎样运用这种反射机制的。


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书会第9群:808517103

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

XML基础教程

本书分为8章。第1章主要对XML做了简单的介绍。第2章详细讲解规范的XML文件。第3章主要讲解有效的XML文件,特别重点讲解DTD文件。第4章讲解C...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊