go语言接口之flag.Value接口

        我们先看下这个会休眠特定时间的程序:

var period = flag.Duration("period", 1*time.Second, "sleep period")func main() {flag.Parse()fmt.Printf("Sleeping for %v...", *period)time.Sleep(*period)fmt.Println()
}

        在它休眠前它会打印出休眠的时间周期。fmt包调用time.Duration的String方法打印这个时间 周期是以用户友好的注解方式,而不是一个纳秒数字:

$ go build gopl.io/ch7/sleep
$ ./sleep
Sleeping for 1s...

        默认情况下,休眠周期是一秒,但是可以通过 -period 这个命令行标记来控制。flag.Duration 函数创建一个time.Duration类型的标记变量并且允许用户通过多种用户友好的方式来设置这 个变量的大小,这种方式还包括和String方法相同的符号排版形式。这种对称设计使得用户交 互良好。

$ ./sleep -period 50ms
Sleeping for 50ms...
$ ./sleep -period 2m30s
Sleeping for 2m30s...
$ ./sleep -period 1.5h
Sleeping for 1h30m0s...
$ ./sleep -period "1 day"
invalid value "1 day" for flag -period: time: invalid duration 1 day

        因为时间周期标记值非常的有用,所以这个特性被构建到了flag包中;但是我们为我们自己的 数据类型定义新的标记符号是简单容易的。我们只需要定义一个实现flag.Value接口的类型,如下:

package flag// Value is the interface to the value stored in a flag.
type Value interface {String() stringSet(string) error
}

        String方法格式化标记的值用在命令行帮组消息中;这样每一个flag.Value也是一个 fmt.Stringer。Set方法解析它的字符串参数并且更新标记变量的值。实际上,Set方法和String 是两个相反的操作,所以最好的办法就是对他们使用相同的注解方式。

        让我们定义一个允许通过摄氏度或者华氏温度变换的形式指定温度的celsiusFlag类型。注意 celsiusFlag内嵌了一个Celsius类型,,因此不用实现本身就已经有String方法了。为了实 现flag.Value,我们只需要定义Set方法:

// *celsiusFlag satisfies the flag.Value interface.
type celsiusFlag struct{ Celsius }func (f *celsiusFlag) Set(s string) error {var unit stringvar value float64fmt.Sscanf(s, "%f%s", &value, &unit) // no error check neededswitch unit {case "C", "°C":f.Celsius = Celsius(value)return nilcase "F", "°F":f.Celsius = FToC(Fahrenheit(value))return nil}return fmt.Errorf("invalid temperature %q", s)
}

        调用fmt.Sscanf函数从输入s中解析一个浮点数(value)和一个字符串(unit)。虽然通常必 须检查Sscanf的错误返回,但是在这个例子中我们不需要因为如果有错误发生,就没有switch case会匹配到。

        下面的CelsiusFlag函数将所有逻辑都封装在一起。它返回一个内嵌在celsiusFlag变量f中的 Celsius指针给调用者。Celsius字段是一个会通过Set方法在标记处理的过程中更新的变量。 调用Var方法将标记加入应用的命令行标记集合中,有异常复杂命令行接口的全局变量 flag.CommandLine.Programs可能有几个这个类型的变量。调用Var方法将一个celsiusFlag参 数赋值给一个flag.Value参数,导致编译器去检查celsiusFlag是否有必须的方法。

// CelsiusFlag defines a Celsius flag with the specified name,
// default value, and usage, and returns the address of the flag variable.
// The flag argument must have a quantity and a unit, e.g., "100C".
func CelsiusFlag(name string, value Celsius, usage string) *Celsius {f := celsiusFlag{value}flag.CommandLine.Var(&f, name, usage)return &f.Celsius
}

        现在我们可以开始在我们的程序中使用新的标记:

var temp = tempconv.CelsiusFlag("temp", 20.0, "the temperature")func main() {flag.Parse()fmt.Println(*temp)
}

        下面是典型的场景:

$ go build gopl.io/ch7/tempflag
$ ./tempflag
20°C
$ ./tempflag -temp -18C
-18°C
$ ./tempflag -temp 212°F
100°C
$ ./tempflag -temp 273.15K
invalid value "273.15K" for flag -temp: invalid temperature "273.15K"
Usage of ./tempflag:-temp valuethe temperature (default 20°C)
$ ./tempflag -help
Usage of ./tempflag:-temp valuethe temperature (default 20°C)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/23237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何进行用户研究

进行用户研究是一个系统性和目标驱动的过程,旨在深入了解用户的需求、行为和期望,以便为产品设计、优化和决策提供有力的支持。以下是进行用户研究的详细步骤和方法: 确定研究目标: 在开始用户研究之前,首先需要明确研…

Termux安装SSH服务与内网穿透工具实现远程SFTP传输文件

文章目录 前言1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 前言 本教程主要介绍如何在安卓 Termux 系统中使用 SFTP 文件传输并结合[cpolar内网穿透工具](cpolar - 安全的内网穿透工具)轻松实现无公网IP远程传输,无需购…

ATFX汇市:加拿大央行或启动首次降息,关注加元贬值风险

ATFX汇市:今日21:45,加拿大央行将公布6月份利率决议结果,当前的基准利率为5%,市场普遍预期其将降息25基点,最新基准利率有可能调降至4.75%。市场人士预期降息的主要依据有两点,其一是加拿大央行行长麦克勒姆…

超级详细Spring AI运用Ollama大模型

大模型工具Ollama 官网:https://ollama.com/ Ollama是一个用于部署和运行各种开源大模型的工具; 它能够帮助用户快速在本地运行各种大模型,极大地简化了大模型在本地运行的过程。用户通过执行几条命令就能在本地运行开源大模型,如Lama 2等; 综上&#x…

PostgreSQL的内存结构

PostgreSQL的内存结构 PostgreSQL 是一个复杂而功能强大的数据库管理系统,其内存结构对于性能和稳定性至关重要。了解 PostgreSQL 的内存管理,可以帮助我们进行数据库调优和故障排查。 内存结构概述 PostgreSQL 的内存结构主要分为三部分:…

每日十题---四

1. 6.5 js 第八题 以下代码的输出结果是 1 2 3 4 var f function g() { return 23; }; typeof g(); 答: 首先声明函数有两种,一种是函数声明,一种是表达式声明。这里就是表达式声明,所以声明之后,只能使用 f(…

SpringBoot:SpringBoot中使用Redisson实现分布式锁

一、前言 Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。 刚好项目中需要使用到分布式锁,记录一下Redisson是如何使用分布式…

Day1——一些感想,学习计划和自我激励(不重要,跳过吧)

笨人刚刚接触计算机的时候,属于是两眼一抹黑。高考后玩了一整个暑假,脑子已经丢掉了,学起来很痛苦,但是也在学习过程中接触到了很多新鲜的东西,现在对于计算机的各种方向,我都很想试试(试试就逝…

(免费领源码)Java#springboot#MySQL书法社团管理系统36200-计算机毕业设计项目选题推荐

目 录 摘要 Abstract 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 书法社团管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析…

SqlServer2016企业版安装

前言 好久没有知识的累积,最近工作上遇到新的SqlServer2016安装,记录一下 参考文章 SQL Server 2016软件安装包和安装教程 - 哔哩哔哩 (bilibili.com) 安装包准备 需要提前准备软件安装包如下 cn_sql_server_2016_enterprise_x64_dvd_8699450&…

【文档智能】符合人类阅读顺序的文档模型-LayoutReader原理及权重开源

引言 阅读顺序检测旨在捕获人类读者能够自然理解的单词序列。现有的OCR引擎通常按照从上到下、从左到右的方式排列识别到的文本行,但这并不适用于某些文档类型,如多栏模板、表格等。LayoutReader模型使用seq2seq模型捕获文本和布局信息,用于…

如何使用 DANN 改进神经网络

文章目录 一、说明二、语言模型真的理解语言吗?三、了解分配转变3.1 样本选择偏差3.2 非静止环境3.3 领域适配挑战3.4 概念漂移 四、对领域对抗训练的介绍 一、说明 由于其多功能性,神经网络是大多数现代机器学习管道的主要内容。他们处理非结构化数据的…

【Visual Studio 2022 部署 .net core website】

部署网站 AdminPortal.csproj false Website File Nameappsettings.jsonAdminPortal.deps.jsonAdminPortal.runtimeconfig.json–web.configAPI.runtimeconfig.json

大模型知识总结

大模型知识总结 重点论文 论文列表:https://zhuanlan.zhihu.com/p/622541777 gpt2: Language Models are Unsupervised Multitask Learners gpt3: Language Models are Few-Shot Learners openai-RHLF(gpt-3.5): Training language models to follow instructio…

idea 中:运行 Application 时出错。命令行过长

一、问题描述: idea 导入新项目,在编译后,运行项目时,报以下错误: 14:47 运行 Application 时出错运行 Application 时出错。命令行过长。通过 JAR 清单或通过类路径文件缩短命令行,然后重新运行。二、问题…

出现TypeError: ‘int‘ object is not callable 的解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 执行代码的时候出现如下问题: Traceback (most recent call last):File "train.py", line 179, in <module>train(args, model, optimizer)File

GUI guider 常用函数解析

GUI Guider 是 NXP 提供的用于设计和生成 LittlevGL (LVGL) 用户界面的工具。它生成的代码包括初始化、事件处理和其他相关功能。以下是一些常用的 GUI Guider 函数及其介绍&#xff1a; 1. void setup_scr_<screen_name>(lv_ui *ui) 描述: 初始化并设置指定的屏幕。 参…

扩展 Kafka 集群从三台节点到四台节点的过程

扩展 Kafka 集群从三台节点到四台节点的过程可以分为以下几个步骤。这个过程需要同时配置 Kafka 和 ZooKeeper&#xff0c;确保新的节点能够无缝地加入集群。 目录 步骤 1: 安装并配置 Kafka 和 ZooKeeper步骤 2: 配置并启动新的 Kafka 节点步骤 3: 更新集群元数据步骤 4: 更新…

Linux前端与Windows前端区别:深入剖析两大系统的前端差异

Linux前端与Windows前端区别&#xff1a;深入剖析两大系统的前端差异 在前端开发的领域中&#xff0c;Linux和Windows两大操作系统各自拥有着独特的优势和特点。对于开发者而言&#xff0c;理解并把握这些差异&#xff0c;将有助于更高效地选择适合自己的开发环境&#xff0c;…

element ui 实现 分步表单

方法一&#xff1a; <template><div class"main-container"><el-card :body-style"{ padding: 20px }" shadow"hover"><el-steps:active"activeStep"align-centerfinish-status"success"class"s…