当我们希望通过命令行启动Golang程序,获取输入的各种形式参数时,该如何处理呢?

[os.Args]

os.Args是一个string的切片,用来存储所有的命令行参数,包括go run main.go这部分,整体编译后实际是生成和运行的main.exe文件,所以第一个参数是main.exe。示例如下:

func main() {
for i ,v := range os.Args {
fmt.Println(i, v)
}
}

命令行携带参数启动:go run main.go -name korbin aaa bbb ccc

0 C:\Users\Korbin\AppData\Local\Temp\go-build427584346\b001\exe\main.exe
1 -name
2 korbin
3 aaa
4 bbb
5 ccc

[flag]

Golang内置的flag包提供了一系列解析命令行参数的功能接口,使用flag主要包括以下几步:

1.定义flag命令行参数

1).通过flag.String()Bool()Int() 等flag.Xxx()方法,该种方式返回一个相应的指针:

ip := flag.Int("name", "korbin", "the author's name")

方法中有三个参数:

  name:表示指定的参数名,在命令行中输入为-name或--name

  value:表示默认值

  usage:参数说明描述

2).通过flag.XxxVar()方法将参数值绑定到一个变量,该种方式无返回值,如:

var name string
flag.StringVar(&name , "name", "korbin", "the author's name")

3).通过flag.Var()绑定自定义类型,自定义类型需要实现Value接口(Receives必须为指针),如:

flag.Var(&name, "name", "the author's name")

对于这种类型的flag,默认值为该变量类型的初始值,即输入的是int类型则默认为0,string默认为空等。

2.flag.Parse()

第二步,调用flag.Parse() 将命令行参数解析到定义的flag:

flag.Parse()

解析函数将会在碰到第一个非flag命令行参数时停止,非flag命令行参数是指不满足命令行语法的参数,如命令行参数为cmd --flag=true abc则第一个非 flag 命令行参数为“abc”

3.

通过上述定义参数和解析参数两步,就已经是可以拿到我们的参数了。并且对于非命令行参数,还可通过flag.Args()flag.Arg(i)来获取 ~

package main

import (
"flag"
"fmt"
"os"
) func main() {
s := flag.String("name", "korbin", "这是作者的姓名")
flag.Parse()
fmt.Println("命令行参数name的值:",*s)
fmt.Printf("非命令行参数切片:%v", flag.Args())
}

命令行携带参数启动:go run main.go -name korbin aaa bbb ccc,运行结果如下:

命令行参数name的值: korbin
非命令行参数切片:[aaa bbb ccc]

flag 支持的解析类型有下面四种

  • -flag
  • --flag
  • -flag=x
  • -flag x (bool 不能用这个)

有时候我们只需要一个 flag 就够了,选项本身就带着含义,不需要参数。而有些时候我们既需要 flag,也需要参数。注意区分好场景即可。如果用了第一种和第二种这种不带参数的,本质含义就是个 bool,出现就是 true,不出现就看默认值。

flag参考:

  • https://mp.weixin.qq.com/s/j-6tdYSdplY8Q2mwMgw8jQ

golang之命令行参数的更多相关文章

  1. Golang: 打印命令行参数

    记得最早在学校机房学习 Java 时,照着书上的例子,写一个最简单 main 方法,当程序运行并在屏幕上打印出 hello world 时,内心竟有种莫名的激动,相信很多人都有这种经历吧. 不管学什么 ...

  2. Golang: Cobra命令行参数库的使用

    将cobra下载到 $GOPATH,用命令: go get -v github.com/spf13/cobra/cobra 然后使用 go install github.com/spf13/cobra ...

  3. golang命令行参数

    os.Args获取命令行参数 os.Args是一个srting的切片,用来存储所有的命令行参数 package main import ( "fmt" "os" ...

  4. golang学习笔记 ---命令行参数

    os 包以跨平台的方式,提供了一些与操作系统交互的函数和变量.程序的命令行参数可从os包的Args变量获取:os包外部使用os.Args访问该变量. os.Args变量是一个字符串(string)的切 ...

  5. go语言之行--文件操作、命令行参数、序列化与反序列化详解

    一.简介 文件操作对于我们来说也是非常常用的,在python中使用open函数来对文件进行操作,而在go语言中我们使用os.File对文件进行操作. 二.终端读写 操作终端句柄常量 os.Stdin: ...

  6. [日常] Go语言圣经-命令行参数

    1.编译 go build hello.go 2.go get gopl.io/ch1/helloworld 命令,就会从网上获取代码,并放到对应目录中 下载的代码会放在$GOPATH/src/gop ...

  7. golang---命令源码文件与命令行参数

    命令源码文件是程序的运行入口,是每个可独立运行的程序必须拥有的. import "flag"  flag包实现了命令行参数的解析.每个参数认为一条记录,根据实际进行定义,到一个se ...

  8. python处理命令行参数

    直接从命令行执行py文件的时候如果带有参数,如何获取这些参数,如何解析? http://blog.chinaunix.net/uid-20786165-id-3182268.html sys.argv ...

  9. .NET Core采用的全新配置系统[5]: 聊聊默认支持的各种配置源[内存变量,环境变量和命令行参数]

    较之传统通过App.config和Web.config这两个XML文件承载的配置系统,.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种不同配置源的支持.我们可以将内存变量.命令行参 ...

  10. Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数

    特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数是$1,第二个参数是$2. $# 传递给脚本或函数的参数个数. $* 传 ...

随机推荐

  1. 淘宝开放平台api申请,淘宝开放平台api租用,淘宝开放平台api无法申请,淘宝开放平台api暂停接入

    目前淘宝开放平台应用申请是关闭了的,已经无法申请到了,如果你是天猫店铺,可以申请供自己店铺使用的权限,如果你不是天猫店铺或者你是软件开发商,目前是申请不到权限的 如果你必须要用到这个权限包的话,可以联 ...

  2. pyspark 数据类型及转换

    spark 有哪些数据类型 https://spark.apache.org/docs/latest/sql-reference.html Spark 数据类型 Data Types Spark SQ ...

  3. (零) React Native 项目开发拾遗

    一位离职的前端同事,最近接了个 React Native 的活儿,遇到许多搞不定的问题,于是找到我帮忙"补课"(没有系统的学习 React Native,也不具备原生 Androi ...

  4. Vue3 动态子页面和菜单栏同步

    动态子页面 <router-view></router-view>显示子页面的内容 main.vue <template> <a-layout id=&quo ...

  5. 系统编程-进程-fork深度理解、vfork简介

    1. fork基本使用 #include <unistd.h> #include <stdio.h> int main(){ pid_t pid = fork(); if(pi ...

  6. PMP——如何区分项目启动会和开踢会?

    在PMP考试中非常强调两个重要会议,一个叫做启动会(Initiating Meeting),另一个叫做开踢会议(Kick-off Meeting),俗称两会. 项目启动会的作用是通过发布项目章程来授权 ...

  7. Vue 调用后台接口导出Excel

    vue 调用后台接口生成 Excel 咱也不会前端,就是现学现卖. Js export function exportOnlyB(reportId) { return request({ url: & ...

  8. BTF:实践指南

    BPF 是 Linux 内核中基于寄存器的虚拟机,可安全.高效和事件驱动的方式执行加载至内核的字节码.与内核模块不同,BPF 程序经过验证以确保它们终止并且不包含任何可能锁定内核的循环.BPF 程序允 ...

  9. 线段树介绍(segment tree)

    1.引入 给定一个区间\([1, n]\),希望你实现一种数据结构,支持以下操作: 1.修改\(i\)号节点的值. 2.询问区间\([i, j]\)中所有节点的和. 这不是树状数组板子 3.修改区间\ ...

  10. Teradata退出中国,您可以相信中国数据库!

    继Adobe.Tableau.Salesforce之后,2023年2月15日,数仓软件巨头Teradata宣布将逐步结束在中国的直接运营.数仓界的"黄埔军校"仓皇撤出中国市场给出的 ...