7.4 flag.Value接口

在本章,我们会学到另一个标准的接口类型flag.Value是怎么帮助命令行标记定义新的符号的。

代码

  1. 章节中样例
  2. 练习 7.6: 对tempFlag加入支持开尔文温度
  3. 练习 7.7: 解释为什么帮助信息在它的默认值是20.0没有包含°C的情况下输出了°C

func main() {//7.4 flag.Value接口test_flag()
}//7.4 flag.Value接口
func test_flag()  {//var period = flag.Duration("period", 1*time.Second, "sleep period")var period = flag.Duration("period", 50 * time.Millisecond, "sleep period")//var period = flag.Duration("period", 2 * time.Minute + 30 *time.Second, "sleep period")//var period = flag.Duration("period", 1 * time.Hour + 30 * time.Minute, "sleep period")//var period = flag.Duration("period", 24 * time.Hour, "sleep period")flag.Parse()fmt.Printf("Sleeping for %v...\n", *period)time.Sleep(*period)type Value interface {String() stringSet(string) error}fmt.Println("================================")//var temp = tempconv.CelsiusFlag("temp", 20.0, "the temperature")//var temp = tempconv.CelsiusFlag("temp", -18.0, "the temperature")//flag.Parse()//fmt.Println(*temp)//练习 7.6: 对tempFlag加入支持开尔文温度。var tempF = tempconv.FahrenheitFlag("temp", -18.0, "the temperature")flag.Parse()fmt.Println(*tempF)//练习 7.7: 解释为什么帮助信息在它的默认值是20.0没有包含°C的情况下输出了°C。//因为CelsiusFlag实现了set接口,一个*Celsius类型赋给了flag,flag实现的stringter接口//最终使Celsius调用了自身实现的string方法,从而将Celsius的值转成带°C的字符串
}
tempconv.go 在原2.5章节的基础上增加的代码
//练习 7.6: 对tempFlag加入支持开尔文温度。
type fahrenheitFlag struct{ Fahrenheit }//练习 7.6: 对tempFlag加入支持开尔文温度。
func (f *fahrenheitFlag) Set(s string) error {var unit stringvar value float64fmt.Sscanf(s, "%f%s", &value, &unit) // no error check neededswitch unit {case "F", "°F":f.Fahrenheit = Fahrenheit(value)return nilcase "C", "°C":f.Fahrenheit = CToF(Celsius(value))return nil}return fmt.Errorf("invalid temperature %q", s)
}//练习 7.6: 对tempFlag加入支持开尔文温度。
func FahrenheitFlag(name string, value Fahrenheit, usage string) *Fahrenheit {f := fahrenheitFlag{value}flag.CommandLine.Var(&f, name, usage)return &f.Fahrenheit
}

Go 语言圣经 7.4 flag.Value接口相关推荐

  1. 《Go语言圣经》学习笔记 第七章 接口

    <Go语言圣经>学习笔记 第七章 接口 目录 接口是合约 接口类型 实现接口的条件 flag.Value接口 接口值 sort.Interface接口 http.Handle接口 erro ...

  2. Go 接口及其相关机制深入解读加源码剖析 【Go语言圣经笔记】

    接口 接口类型是对其它类型行为的抽象和概括:因为接口类型不会和特定的实现细节绑定在一起,通过这种抽象的方式我们可以让我们的函数更加灵活和更具有适应能力. 很多面向对象的语言都有相似的接口概念,但Go语 ...

  3. 《Go语言圣经》学习笔记 第十章 包和工具

    <Go语言圣经>学习笔记 第十章 包和工具 目录 包简介 导入路径 包声明 导入声明 包的匿名导入 包和命名 工具 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. G ...

  4. 《Go语言圣经》学习笔记 第八章 Groroutines和Channels

    <Go语言圣经>学习笔记 第八章 Groroutines和Channels 目录 Goroutines 实例:并发的Clock服务 实例:并发的Echo服务 Channels 并发的循环 ...

  5. 《Go语言圣经》学习笔记 第二章 程序结构

    Go语言圣经学习笔记 第二章 程序结构 目录 命名 声明 变量 赋值 类型 包和文件 作用域 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语言小白学习笔记,几乎是书上的内 ...

  6. [日常] go语言圣经-声明,变量,赋值,类型,包和文件习题

    go语言圣经-声明 1.四种类型的声明语句:var.const.type和func,分别对应变量.常量.类型和函数实体对象的声明 2.包一级声明语句声明的名字可在整个包对应的每个源文件中访问,局部声明 ...

  7. Go 语言圣经 练习8.1

    Go语言圣经 练习8.1 练习 8.1: 修改clock2来支持传入参数作为端口号,然后写一个clockwall的程序,这个程序可以同时与多个clock服务器通信,从多个服务器中读取时间,并且在一个表 ...

  8. go channel 缓冲区最大限制_GO语言圣经学习笔记(八)Goroutines和Channels

    奋斗鸭!Day97 知识点 goroutinue 基本用法 golang非常深度的简化了goroutinue的使用方法,异常简单,门槛降低很多 // goroutinue 使用非常简单go f() G ...

  9. 《Go语言圣经》学习笔记 第九章 基于共享变量的并发

    <Go语言圣经>学习笔记 第九章 基于共享变量的并发 目录 竞争条件 sync.Mutex互斥锁 syn.RWMutex读写锁 内存同步 syn.Once初始化 竞争条件检测 示例:并发的 ...

最新文章

  1. MySQL5.7.10多元复制功能搭建
  2. cas单点登陆。就这一篇就够了!!!!!
  3. HTML5 Canvas 旋转
  4. Python之sklearn:GridSearchCV()和fit()函数的简介、具体案例、使用方法之详细攻略
  5. 怎样用uml类图生成java类_JAVA:面向对象编程的底层逻辑,深度剖析
  6. 如何将视频下载并且转码拼接
  7. CentOS6.5下搭建SVN服务器
  8. 【最全最详细】publiccms常用的代码片段
  9. 【Infragistics教程】在javascript构造函数中创建基本继承
  10. HWM和delete,drop,truncate的关系
  11. pyqt5设置按钮,移上去变为手型
  12. Android MMKV框架引入使用
  13. LVDS,接口,时序讲解
  14. 广电CMMB拒考手机电视国标 新面孔IMMB欲分羹
  15. 100层楼扔两个鸡蛋的问题
  16. 【洛谷】P2689 东南西北 c++
  17. 天九共享集团:为创业者提供坚实的信用背书
  18. 致终将火爆的NFC——ISO14443 TypeA(一)
  19. 《卷积网络》深度卷积网络实例
  20. kubernetes1.22安装使用ingress-nginx

热门文章

  1. 团队软件库_CPU怎么建软件生态
  2. 基于scrapy框架的爬虫详细步骤(含没有“下一页”按钮的href抓取)
  3. 微信公众平台深度开发JAVA版第一季 16.响应被动消息4
  4. http://36kr.com/p/5064568.html?ktm_source=feed
  5. 7:JSON-Java Spring
  6. 吉他mi指型吉他谱_我需要一个吉他老师。 所以我把我的Alexa变成了一个。
  7. shell把文件导出 怎么通过adb,adb文件管理命令操作实例讲解
  8. 读陆文周之《Qt 5 开发及实例》
  9. ESLint对a标签href属性警告解决方法
  10. 从零开始的使用阿里云搭建我的世界服务器