golang---命令源码文件与命令行参数
命令源码文件是程序的运行入口,是每个可独立运行的程序必须拥有的。
import "flag"
flag包实现了命令行参数的解析。每个参数认为一条记录,根据实际进行定义,到一个set集合。每条都有各自的状态参数。
在使用flag时正常流程:
1. 通过flag.String(), flag.Bool(), flag.Int()等函数来定义命令行中需要使用的参数。
2. 在定义完flag后,通过调用flag.Parse()来进行对命令行参数的解析。
3. 获取flag.String(), flag.Bool(), flag.Int()等方法的返回值,即对应用户输入的参数.
注意的是flag.Xxx()返回的值是变量的内存地址,要获取值时要通过在变量前加*(星号)获取.
说明:
像flag.Int、flag.Bool、flag.String这样的函数格式都是一样的,调用的时候需要传入3个参数
参数的说明如下:
第一个arg表示参数名称,在控制台的时候,提供给用户使用.
第二个arg表示默认值,如果用户在控制台没有给该参数赋值的话,就会使用该默认值.
第三个arg表示使用说明和描述,在控制台中输入-arg的时候会显示该说明,类似-help
可注册flag类型有:Bool / Int / Int64 / Uint / Uint64 / Float / Float64 / String / Duration / Var
type Flag
type Flag struct {
Name string // flag在命令行中的名字
Usage string // 帮助信息
Value Value // 要设置的值
DefValue string // 默认值(文本格式),用于使用信息
}
Flag类型代表一条flag的状态。
type FlagSet
type FlagSet struct {
// Usage函数在解析flag出现错误时会被调用
// 该字段为一个函数(而非采用方法),以便修改为自定义的错误处理函数
Usage func()
// 内含隐藏或非导出字段
}
FlagSet代表一个已注册的flag的集合。FlagSet零值没有名字,采用ContinueOnError错误处理策略。
func Int
func Int(name string, value int, usage string) *int
Int用指定的名称、默认值、提示信息注册一个int类型flag。返回一个保存了该flag的值的指针。
func IntVar
func IntVar(p *int, name string, value int, usage string)
IntVar用指定的名称、默认值、使用信息注册一个int类型flag,并将flag的值保存到p指向的变量。
func Parse
func Parse()
从os.Args[1:]中解析注册的flag。必须在所有flag都注册好而未访问其值时执行。未注册却使用flag -help时,会返回ErrHelp。
即:将输入的flag和注册的flag进行匹配解析
func Parsed
func Parsed() bool
返回是否Parse已经被调用过。
示例代码:
main.go
package main import (
"flag"
"fmt"
) func main() {
married := flag.Bool("married", false, "Are you married?")
age := flag.Int("age", 22, "How old are you?")
name := flag.String("name", " ", "What your name?") var address string
//flag.StringVar这样的函数第一个参数换成了变量地址,后面的参数和flag.String是一样的。
flag.StringVar(&address, "address", "GuangZhou", "Where is your address?") flag.Parse() //解析输入的参数 fmt.Println("输出的参数married的值是:", *married) //不加*号的话,输出的是内存地址
fmt.Println("输出的参数age的值是:", *age)
fmt.Println("输出的参数name的值是:", *name)
fmt.Println("输出的参数address的值是:", address)
}
执行结果:
address参数我们并没有指定值,则输出的就是默认值.
另外,-arg后面的=号也不是必须的,可以用空格代替.
如果要查看该程序的所有参数的使用,可以使用-help来查看,如下:
func PrintDefaults
func PrintDefaults()
PrintDefault会向标准错误输出写入所有注册好的flag的默认值。
func NFlag
func NFlag() int
NFlag返回已被设置的flag的数量。
func Lookup
func Lookup(name string) *Flag
返回已经已注册flag的Flag结构体指针;如果flag不存在的话,返回nil。
func NArg
func NArg() int
NArg返回解析flag之后剩余参数的个数。
func Args
func Args() []string
返回解析之后剩下的非flag参数。(不包括命令名).就是无法进行flag匹配的有哪些,
func Arg
func Arg(i int) string
返回解析之后剩下的第i个参数,从0开始索引。
func Var
func Var(value Value, name string, usage string)
Var方法使用指定的名字、使用信息注册一个flag。该flag的类型和值由第一个参数表示,该参数应实现了Value接口。例如,用户可以创建一个flag,可以用Value接口的Set方法将逗号分隔的字符串转化为字符串切片。
func Set
func Set(name, value string) error
设置已注册的flag的值,修改或者设置
func Visit
func Visit(fn func(*Flag))
按照字典顺序遍历标签,并且对每个标签调用fn。 这个函数只遍历解析时进行了设置的标签。[就是执行时提供非默认的值]
func VisitAll
func VisitAll(fn func(*Flag))
按照字典顺序遍历标签,并且对每个标签调用fn。 这个函数会遍历所有标签,不管解析时有无进行设置。
package main
import (
"flag"
"fmt"
)
func main() {
// golang的flag包的一些基本使用方法
// 待使用的变量
var id int
var name string
var male bool
// 是否已经解析
fmt.Println("parsed? = ", flag.Parsed())
// 设置flag参数 (变量指针,参数名,默认值,帮助信息)
// 也可以用以下带返回值的方法代替,不过他们返回的是指针,比较麻烦点
// Int(name string, value int, usage string) *int
// String(name string, value string, usage string) *string
// Bool(name string, value bool, usage string) *bool
flag.IntVar(&id, "id", 123, "help msg for id")
flag.StringVar(&name, "name", "default name", "help msg for name")
flag.BoolVar(&male, "male", false, "help msg for male")
// 解析
flag.Parse()
// 是否已经解析
fmt.Println("parsed? = ", flag.Parsed())
//
// 获取非flag参数
fmt.Println(flag.NArg())
fmt.Println("------ Args start ------")
fmt.Println(flag.Args())
for i, v := range flag.Args() {
fmt.Printf("arg[%d] = (%s).\n", i, v)
}
fmt.Println("------ Args end ------")
//
// visit只包含已经设置了的flag
fmt.Println("------ visit flag start ------")
flag.Visit(func(f *flag.Flag) {
fmt.Println(f.Name, f.Value, f.Usage, f.DefValue)
})
fmt.Println("------ visit flag end ------")
//
// visitAll只包含所有的flag(包括未设置的)
fmt.Println("------ visitAll flag start ------")
flag.VisitAll(func(f *flag.Flag) {
fmt.Println(f.Name, f.Value, f.Usage, f.DefValue)
})
fmt.Println("------ visitAll flag end ------")
//
// flag参数
fmt.Printf("id = %d\n", id)
fmt.Printf("name = %s\n", name)
fmt.Printf("male = %t\n", male)
// flag参数默认值
fmt.Println("------ PrintDefaults start ------")
flag.PrintDefaults()
fmt.Println("------ PrintDefaults end ------")
//非flag参数个数
fmt.Printf("NArg = %d\n", flag.NArg())
// 已设置的flag参数个数
fmt.Printf("NFlag = %d\n", flag.NFlag())
}
运行:
go build main.go
main -id 111 -name sary -male "woman" p1 p2 p3
golang---命令源码文件与命令行参数的更多相关文章
- golang学习笔记---命令源码文件接收参数(flag包)
命令源码文件怎样接收参数 go标准库中有一个代码包专门用于接收和解析命令参数.这个包叫flag 实例1: package main import ( "flag" "fm ...
- 命令源码文件——Golang
源码文件又分为三种,即:命令源码文件.库源码文件和测试源码文件,它们都有着不同的用途和编写规则. 命令源码文件:1.独立程序的入口2.属于main包,包含无参数和无结果的main函数3.main函数执 ...
- Go源码文件与命令
Go源码文件 文件类型 命令源码文件 : 声明自己属于main包且包含main函数的源码文件,一个包里边不要有多个命令源码文件,虽然用go install ,go run单独执行命令源码文件没有问题, ...
- go语言的源码文件的分类及含义
Go源码文件:名称以.go为后缀,内容以Go语言代码组织的文件 多个Go源码文件是需要用代码包组织起来的 源码文件分为三类:命令源码文件.库源码文件(go语言程序) 测试源码文件(辅助源码文件) 命令 ...
- 《UNIX网络编程(第3版)》unp.h等源码文件的编译安装
操作系统:Mac OS X 10.11.5 1.下载书中的源代码:点击下载 2.切换到解压后的目录 unpv13e,先查看下 README,依次执行: ./configure cd lib make ...
- Python源码文件中带有中文时,输出乱码
Python源码文件中带有中文时,文件头应加注释: #!/usr/bin/env python # -*- coding: utf-8 -*- 第一行注释是为了告诉Linux/OS X系统,这是一个P ...
- [C/C++] 各种C/C++编译器对UTF-8源码文件的兼容性测试(VC、GCC、BCB)
在不同平台上开发C/C++程序时,为了避免源码文件乱码,得采用UTF-8编码来存储源码文件.但是很多编译器对UTF-8源码文件兼容性不佳,于是我做了一些测试,分析了最佳保存方案. 一.测试程序 为了测 ...
- Erlang千万级用户游戏框架(Openpoker)源码文件分析清单
openpoker源码 erlang写的网游服务器源码,OpenPoker是一个大型多人扑克网游,内建支持了容错能力,负载平衡和无限制的规模大小.本文是openpoker源码文件功能的一个清单式说明: ...
- C++ 多源码文件简单组织
C++ 多源码文件简单组织 基本上和C的是一样的,只不过C++的方法要在类中声明.看一个简单实例.ainimal.h 类里面对外公开的信息. 点击(此处)折叠或打开 #ifndef _ANIMAL_ ...
随机推荐
- Android源码分析(九)-----如何修改Android系统默认时间
一 : 修改Android系统默认时间 源码路径:frameworks/base/services/java/com/android/server/SystemServer.java 主要变量EARL ...
- NameNode && Secondary NameNode工作机制
NameNode && Secondary NameNode工作机制 1)工作流程 2) fsimage和edits NameNode是HDFS的大脑,它维护着整个文件系统的目录树, ...
- Oracle 数据库修复一例
Oracle 数据库修复一例:(系统装有两个实例,分别是:bhorcl,orcl)今天一台生产服务器的Oracle不能正常登录,用plSql登录,提示:TNS:listernet does noet ...
- k8s krew 插件管理工具
参考:https://github.com/kubernetes-sigs/krew https://int32bit.me/2019/12/05/%E5%88%86%E4%BA%AB%E5%87%A ...
- Linux shell while循环语句
for :明确循环次数 while :不确定循环换次数 while循环 (1) while CONDITION:do statement statement < ...
- python基础语法16 面向对象3 组合,封装,访问限制机制,内置装饰器property
组合: 夺命三问: 1.什么是组合? 组合指的是一个对象中,包含另一个或多个对象. 2.为什么要用组合? 减少代码的冗余. 3.如何使用组合? 耦合度: 耦: 莲藕 ---> 藕断丝连 - 耦合 ...
- 18-C#笔记-继承
1. 子类可以使用父类的成员和函数. 和C++不同,使用的是一个冒号 2. 不支持多重继承 但是可以通过接口(interface)这种结构实现.后续讲解. using System; namespac ...
- c语言中的数据类型的最大最小值
#include <float.h>#include <limits.h> int n1 = INT_MIN;int n2 = INT_MAX;float f1 = F ...
- Android 开发基础入门篇: Android Studio 导入工程
最简单的方式 等待加载完就好了
- [GXOI/GZOI2019]与或和(位运算,单调栈)
题目链接懒得放了. 题目大意懒得写了. 省选原题哪有找不到的…… 说实话,其实这题是个大水题,被我十秒钟内口胡出来了. 首先位运算除了拆位还能干啥?以下以与为例,或是差不多的. 我们考虑有多少个子矩阵 ...