本文主要对golang环境下命令行的解析进行了相关的总结.命令行在C下有getopt等函数, 在golang下提供了更为方便的处理方法.

1.命令行参数获取:
命令行获得可通过os.Args参数,
Args在os中定义为:
var Args []string
Args hold the command-line arguments, starting with the program name.
2.命令行解析
golang 对命令行解析提供了flag包,按照功能可以分为以下三类:
1.基本命令解析
2.自定义参数解析
3.解析外部命令字符串

1.基本命令解析
命令注册:
通过flag.type(int,string等),提供命令名称, 默认参数值
按照返回值的形式分为两种, 返回值为值的指针, 通过传入指针,解析值后写入传入的指针
命令解析:
调用flag.Parse()解析命令行

2.自定义参数命令解析
自定义变量实现下面的接口:
type Value interface {
String() string
Set(string) error
}
并定义变量,通过flag.Var传入自定义变量

注册命令解析:
var argFlag args
flag.Var(&argFlag, "arg", "comma-separated list of intervals to use between events")
3.解析外部命令字符串
通过flag.NewFlagSet创建flagset.通过set的相关接口注册命令,通过set.Parse解析参数

实践代码如下:

  1. package main
  2.  
  3. import (
  4. "errors"
  5. "flag"
  6. "fmt"
  7. "strings"
  8. "time"
  9. )
  10.  
  11. type args []string
  12.  
  13. func (a *args) String() string {
  14. return fmt.Sprintf("%v", *a)
  15. }
  16.  
  17. func (i *args) Set(value string) error {
  18. if len(*i) > {
  19. return errors.New("interval flag already set")
  20. }
  21. for _, dt := range strings.Split(value, ",") {
  22. *i = append(*i, dt)
  23. }
  24. return nil
  25. }
  26.  
  27. //基本解析函数的使用
  28. func base_parse() {
  29. const (
  30. defaultGopher = "pocket"
  31. usage = "the variety of gopher"
  32. )
  33. var log int
  34. //init for init param, return int point
  35. // param:name, deaault val, help message
  36. //解析参数通过指针返回
  37. var intflag = flag.Int("int", , "help message for int")
  38. flag.StringVar(&gopherType, "gopher_type", defaultGopher, usage)
  39. flag.StringVar(&gopherType, "g", defaultGopher, usage+"(shorthand)")
  40. //指定一个传入参数的指针
  41. flag.IntVar(&log, "log_level", , "log level")
  42. flag.Parse()
  43. fmt.Println("initFlag:", *intflag)
  44. fmt.Println("log_level:", log)
  45. fmt.Println("gopherType string ", gopherType)
  46. }
  47.  
  48. /*自定义参数解析*/
  49. func userdef_parse() {
  50. var argFlag args
  51. flag.Var(&intervalFlag, "deltaT", "comma-separated list of intervals to use between events")
  52. flag.Var(&argFlag, "arg", "comma-separated list of intervals to use between events")
  53. flag.Parse()
  54. fmt.Println("arg string ", argFlag)
  55. fmt.Println(intervalFlag)
  56. }
  57.  
  58. /*解析传入的字符串*/
  59. func parse_input(arg string) {
  60. argv := []string{}
  61. for _, dt := range strings.Split(arg, " ") {
  62. argv = append(argv, dt)
  63. }
  64. //创建flagSet
  65. set := flag.NewFlagSet("test", flag.ExitOnError)
  66. //注册解析参数
  67. varflag := set.String("ver", "myver", "version")
  68. pflag := set.String("p", "myp", "version")
  69. //解析参数
  70. set.Parse(argv)
  71. fmt.Println("input parse:", *varflag, *pflag)
  72. }
  73. func main() {
  74. userdef_parse()
  75. parse_input("-p 123 -ver 1234")
  76. }

golang flag的更多相关文章

  1. Golang : flag 包简介

    在 Golang 程序中有很多种方法来处理命令行参数.简单的情况下可以不使用任何库,直接处理 os.Args:其实 Golang 的标准库提供了 flag 包来处理命令行参数:还有第三方提供的处理命令 ...

  2. golang flag包

    go flag 包用来解析命令行参数,通过一个简单的例子来了解下 package main import (     "flag"     "fmt" ) fu ...

  3. golang flag包简单例子

    package main import ( "flag" "fmt" ) var workers int; func main() { flag.IntVar( ...

  4. golang flag简单用法

    package main import ( "flag" "strings" "os" "fmt" ) var ARGS ...

  5. Golang flag包使用详解(一)

    概述 flag包提供了一系列解析命令行参数的功能接口 命令行语法 命令行语法主要有以下几种形式 -flag //只支持bool类型 -flag=x -flag x //只支持非bool类型 以上语法对 ...

  6. golang获取命令行参数

    部署golang项目时难免要通过命令行来设置一些参数,那么在golang中如何操作命令行参数呢?可以使用os库和flag库. 1.golang os库获取命令行参数 os可以通过变量Args来获取命令 ...

  7. Golang : pflag 包简介

    笔者在前文中介绍了 Golang 标准库中 flag 包的用法,事实上有一个第三方的命令行参数解析包 pflag 比 flag 包使用的更为广泛.pflag 包的设计目的就是替代标准库中的 flag ...

  8. [inner] bug

    这样正确 command: ["sh", "-c", "mysql -h${DC_DB_HOST} -uroot -p${MYSQL_ROOT_PAS ...

  9. golang 之 flag.String

    无论是c语言还是golang语言或是其他语言,启动应用程序时都可以带一些参数,然后系统根据传入的参数进行特点的工作.如:./main -b /home/backupdir -d true 那么如何更好 ...

随机推荐

  1. Luogu 5043 【模板】树同构([BJOI2015]树的同构)

    BZOJ 4337 简单记录一种树哈希的方法:以$x$为根的子树的哈希值为$\sum_{y \in son(x)}f_y*base_i$,$f_y$表示以$y$为根的树的哈希值,其中$i$表示$f_y ...

  2. css总结20:TCP通信协议WebSocket

    HTML5 WebSocket 1 介绍: WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. 在WebSocket API中,浏览器和服务器只需要做一个握手的动 ...

  3. JSP+JDBC实现在可视化页面中插入数据到SQL数据库

    原创 本篇博客创建一个如下图所示的JSP页面,将用户填入的数据插入到对应的数据库中. JSP页面代码: <%@ page language="java" contentTyp ...

  4. jeecms如何迭代list集合

    [@cms_channel_list][#list tag_list as a ]${a.name} [/#list][/@cms_channel_list]使用[XXX_list] 参数为 tag_ ...

  5. PLSA的EM推导

    本文作为em算法在图模型中的一个应用,推导plsa的em算法. 1 em算法 em算法是解决一类带有隐变量模型的参数估计问题. 1.1 模型的定义 输入样本为,对应的隐变量为.待估计的模型参数为,目标 ...

  6. utf-8是否带签名 乱码问题。

    Encoding utf8 = new UTF8Encoding(true); 参数表示是否带签名, 但此是否带签名在WriteAllBytes 无效,生成的永远是无签名的. 但在WriteAllTe ...

  7. Highsoft.Highcharts 5.0.6439.38401 key

    Highcharts .NET allows developers to make charts using Highcharts API with the Microsoft .NET Framew ...

  8. Android学习笔记AutoCompleteTextView的使用

    activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...

  9. docker系列 参考文章

    Docker 系列一(概念原理和安装) Docker 系列二(操作镜像) Docker 系列三(容器管理) 持续更新... ubuntu 安装docker 参考文章 :(https://blog.cs ...

  10. HDP 中 yarn 和 MR2 的配置

    以下说明均以集群中 slave 结点的配置为 48G内存,12块硬盘,12核(core) CPU 为例. 在 Yarn 中,一个 Container 是一个基础的包含内存和CPU 的单元.为了较好的平 ...