CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛
CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛
CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛

go源码分析之flag包-源码交易平台丞旭猿

使用场景

该章节介绍该包的使用场景

当编写go语言程序的时候,一般我们会需要对命令输入参数做解析。flag包为我们提供了官方通用的解析方案。

举个例子: 有一个计算程序calc 要求输入形式如下

calc –n1 123 –n2 456 –op=+ –islog

上面的例子中包含四个参数,n1,n2,op,islog

可以看出参数包含三种格式:

  1. –flag *
  2. –flag=*
  3. –flag

每种参数对应的值(也就是上面的*)需要解析成不同的类型。

比如第三种类型需要解析成bool类型值

根据程序要求,例子中的n1需要解析为整数

op需要解析成字符串

整体架构

本章节主要介绍该包的大体框架

flag包采用builder的模式进行设计。使用解析工厂类(FlagSet)用于参数的解析,工厂类中可以注册多个解析组件(Flag),解析组件用于具体某一项参数的解析,Flag组件通常包含参数名,默认值,提示信息,解析后值几部分内容。flag包中包含多个不同的解析组件,用于解析不同类型的参数。

再注册完解析组件后,执行解析动作(Prase)即可完成解析。

数据结构解析——Flag类

本章节介绍Flag类结构以及使用方法

由于知乎bug,手机无法使用粘贴功能,只能手写,坑……

  • Name 保存的是参数名信息
  • Usage 帮助信息
  • Value 存储值内容
  • DefaultValue 默认值信息

Value是接口类型用于具体类型与字符串之间的转换(序列化),flag包中实现了多个类型转换类型。

  • boolValue
  • intValue
  • int64value
  • uintvalue
  • uint64value
  • 等……(太多了后面就不写了,可以直接看源码文件)

数据结构解析——FlagSet类

该类是Flag的集合类,参数如下

  • Usage 函数指针,在解析出错的时候执行
  • name 名字
  • parsed 是否已经解析完成
  • actual flag数组,map类型 保存执行解析的解析组件
  • formal 保存所有注册的解析组件
  • args 参数信息
  • errorHandling 遇到错误时如何处理,三个方式,返回错误,错误退出,错误panic
  • output 输出类型

流程解析——注册Flag组件

注册Flag组件的核心函数为FlagSet.Var。 由于知乎bug,现在无法粘贴源码。基本上处理流程如下:

  1. 根据入参信息创建Flag对象
  2. 将Flag对象保存到formal中

流程解析——参数解析流程

在注册完成后就可以执行参数解析工作了,参数解析的入口函数为FlagSet.Parse。由于知乎bug,无法粘贴代码进来,可以看到核心代码为praseone,该函数用于一个参数的解析工作。从该函数中可以看到切片的灵活,c/c++当然也可以实现类似效果,但是会费劲很多。

流程解析——遍历操作

实际上,截止到上节,flag包的基本功能都分析完了,在解析的时候,执行解析的组件会将本组件放入act数组中。 如果我们对解析组件有遍历操作的诉求的话,act数组大概就是为了满足这种诉求存在的。 该功能的入口函数为,flagset.visiter和visiterall

前者遍历act数组,后者遍历formal数组。

扩展分析——全局参数解析

flag包中默认情况下创建了一个对象,用于操作系统执行时带的入参的解析,基本上flagset的成员函数都封装了一个全局函数与之对应。

扩展分析——扩展Value对象

如果有新的类型需要解析的话,可以实现新的value对象即可,使用时用Flag对象做一下封装~

总结

总体来说,该模块实现相对比较简单,由于无法粘贴源码,很多情况下都只能空口解析。之后有时间再在电脑上补一下吧。

不足的地方,从源码分析来看。该模块的核心功能prase函数应该没有考虑重复执行的场景,重复使用同一个flagset去解析不同的参数,比较容易出幺蛾子……

声明:本文部分素材转载自互联网,如有侵权立即删除 。

© 版权声明
THE END
喜欢就支持一下吧
点赞0赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容