golang之flag.String、flag.Parse

Go 学习笔记(45)— Go 标准库之 flag(命令行参数解析) 1. 参数解析说明 import "flag" flag 包实现了命令行参数的解析。每个参数认为一条记录,根据实际进行定义,到一个 set 集合。每条都有各自的状态参数。 使用 flag 的正常流程为: 通过 flag.String() , flag.Bool() , flag.Int() 等函数来定义命令行中需要使用的参数; 在定义完 flag 命令行参数后,通过调用 flag.Parse() 来进行对命令行参数的解析; 获取 flag.String() ,flag.Bool() , flag.Int 阅读详情

golang之flag.String、flag.Parse

前言

项目中经常会有这样的需求,一个项目部署在不同的服务器上,而不同的服务器上的配置是不同的,例如一个项目,即部署在国内,又部署在美东,但是国内是国内的一套数据库、redis等等,而国外又是连接国外的数据库、redis等等,这样就需要我们根据部署的环境去加载响应的配置。
那么在go程序启动main运行的时候,我们往往就要加载响应的配置。

具体事件及解决方案

一般部署都是在项目中的.sh脚本文件里,我们在脚本文件里去得到当前的服务器是在国内还是国外,然后依此将服务器发信息传递到go里。
例如,项目中有一个start.sh文件,我们项目根目录有一个conf文件夹
结构如下:

conf/test1/log.conf
conf/test1/mysql.conf
conf/test1/redis.conf

conf/test2/log.conf
conf/test2/mysql.conf
conf/test2/redis.conf

在sh文件里我们判断了当前服务器为test2,在sh文件里

  // 即为将config_conf变量的值传递给go代码
  // 注意,这里的 -后面的d,即为flag.String里的第一个参数,第一个参数写的啥,这里的-后面就是啥
  exec "./bin/$app" -d "$config_conf"
  // 此时config_conf值为conf/test2

下面我们来看go代码

var (
	defaultPath = flag.String("d", "./conf/test1/", "conf path")
	LogFile     = *defaultPath + "log.json"
	confFile    = *defaultPath + "redis.toml"
	Cfg         Config
)

// InitConf 初始化配置文件
func InitConf() error {
	flag.Parse()
	// 如果下面不重新赋值,那么logfile与confile的值仍旧为旧值,即
	// ./conf/test1/...
	LogFile     = *defaultPath + "log.json"
	confFile    = *defaultPath + "project.toml"
	fmt.Println(LogFile)//conf/test2/log.conf
	fmt.Println(confFile)//conf/test2/redis.conf

至此,go代码中就读取到配置文件的信息了。

再来看下flag.Parse()的源码及注释,啥意思呢,就是在变量定义之后,程序访问标志之前去调用该函数,注意flag.String("d"第一个参数,写的是谁,那么.sh文件里的 exec "./bin/ a p p " − d " app" -d " app"−d"config_conf"的-d就是谁,例如flag.String第一个参数为-c那么exec "./bin/ a p p " − c " app" -c" app"−c"config_conf"里就是-c

// Parse parses the command-line flags from os.Args[1:]. Must be called
// after all flags are defined and before flags are accessed by the program.
func Parse() {
	// Ignore errors; CommandLine is set for ExitOnError.
	CommandLine.Parse(os.Args[1:])
}

上面的注释啥意思呢,就是在变量定义之后,程序访问标志之前去调用该函数。
即下面代码中LogFile、confFile都已在var定义过了,然后还并没有使用defaultPath标志变量,然后flag.Parse()函数会将运行命令中的参数通过d这个标志赋值给defaultPath,然后flag.Parse()之后的代码再去取defaultPath的值的时候就拿到了运行命令传递过来的值,即/conf/test2/

var (
	defaultPath = flag.String("d", "./conf/test1/", "conf path")
	LogFile     = "log.json"
	confFile    = "redis.toml"
	Cfg         Config
)

// InitConf 初始化配置文件
func InitConf() error {
	flag.Parse()
	// 如果下面不重新赋值,那么logfile与confile的值仍旧为旧值,即
	// ./conf/test1/...
	LogFile     = *defaultPath + "log.json"
	confFile    = *defaultPath + "project.toml"
	fmt.Println(LogFile)//conf/test2/log.conf
	fmt.Println(confFile)//conf/test2/redis.conf

如果下面这样写是不对的,下面的代码在 flag.Parse()之后并没有去将defaultPath的新值赋值给LogFile、confFile所以运行时取到的还是defaultPath定义的旧值,即./conf/test1/

var (
	defaultPath = flag.String("d", "./conf/test1/", "conf path")
	LogFile     = *defaultPath + "log.json"
	confFile    = *defaultPath + "redis.toml"
	Cfg         Config
)

// InitConf 初始化配置文件
func InitConf() error {
	flag.Parse()

代码测试

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

package main

import (
    "flag"
    "fmt"
)

func main() {
    backup_dir := flag.String("b", "/home/default_dir", "backup path")
    debug_mode := flag.Bool("d", false, "debug mode")

    flag.Parse()

    fmt.Println("backup_dir: ", *backup_dir)
    fmt.Println("debug_mode: ", *debug_mode)
}

/**
    启动命令:go run main.go -b /home/backup
    输出结果:
        backup_dir:  /home/backup  // 因为指定了路径,所以覆盖了默认路径
        debug_mode:  false         // 启动命令里不带 -d 参数,所以启用默认值
 */
SMRATS(一) SMARTS+PPO baseline运行教程 python类方法 class Agent: @classmethod def from_function() python typing 含义 为防止弱类型python出现忘记变量类型的问题,python3.5及之后版本增加了对应的类型提示。 输入和输出类型 函数接受并返回一个字符串,注释像下面这样: def greeting(name: str) -> str: return 'Hello ' + name 常用的typing类型 int,long,float: 整型, 阅读详情

相关推荐

用Matlab和CVX搞定原子范数最小化:一个信号处理小白的避坑实践

本文详细介绍了如何使用Matlab和CVX实现原子范数最小化(Atomic norm minimization),特别适合信号处理初学者。从CVX安装配置、核心代码解析到实战中的典型问题与解决方案,提供了全面的避坑指南。通过具体案例展示了原子范数在频率估计和DOA估计中的优势,并给出性能优化策略和可视化方法。

weixin_28731231的博客 232

golang中的flag.String()和flag.Parse()

golang中的flag.String()和flag.Parse()

weixin_44913757的博客 2135

告别手动解析!用这个Qt库轻松处理Cat 21/62等18种Asterix航空数据

本文介绍了基于Qt框架的高效Asterix报文解析库,帮助开发者轻松处理Cat 21/62等18种航空数据。该库通过协议抽象化、多维度API设计和跨平台支持,解决了手动解析的复杂性和易错问题,显著提升开发效率和系统可靠性。

weixin_42529366的博客 207

Go语言Flag.String获取程序启动参数

有时候我们的程序启动时会需要带一些参数,这个时候怎么golang自带的flag.string来解析参数 参数 功能 name 命令行参数名称,比如 -b, -help value 默认值,未显式指定的参数,给出隐式的默认值,比如本例中-b未给出的话,*b=false usage 提示信息,如果给出的参数不正确或者需要查看帮助 -help,那么会给出这里指定的字符串 flag使用前,必须首先解析:flag.Parse(),代码如下: ...

专注基础架构领域 4076

使用sklearn学习多项式回归(三)

1,什么是线性 我们无数次提到”线性“这个名词。在支持向量机中,我们也曾经提到最初的支持向量机只能够分割线性可分的数据,然后引入了”核函数“来帮助我们分类那些非线性可分的数据。我们也曾经说起过,比如说决策树,支持向量机是”非线性“模型。所有的这些概念,让我们对”线性“这个词非常熟悉,却又非常陌生——因为我们并不知道它的真实含义。接下来我们看看线性回归模型改进的核心之一:帮助线性回归解决非线性问题。 1.1,变量之间的线性关系 ”线性“这个词用于描述不同事物时有着不同的含义。我们最常使用的线性是指“变量

理科男同学 5100

AOI检测总误判?五大常见问题与实战解决方案

通过对图像质量、检测程序、外界干扰、算法优化以及设备维护和校准的全面把控,企业可以有效降低误判率,提升AOI检测的准确性和可靠性,为工业生产提供更有力的质量保障。表现描述:在AOI检测时,元器件字符因印刷颜色深浅、模糊或受到灰尘干扰等差异,再加上元件库参数未根据实际生产优化,会使系统误将合格元件判定为不合格,严重影响生产效益和产品质量。优化元件库:着重检测关键差异字符,如型号编码等关键信息,剔除不必要字符的检测项,减少干扰,专注于关键识别的准确性。检测时,根据物料信息动态更新检测参数,使系统适应物料变化。

ALeader_AOI的博客 3493

flag包之flag.String()

package main import( "fmt" "flag" ) func main() { dir := flag.String("b", "/home/default_dir", "backup path") mode := flag.Bool("d", false, "debug mode") flag.Parse() fmt.Println("dir: ", *dir) } 三种情况:默认、指定路径和-help ...

lihanhan98的博客 3413

动态表单设计

自定一表单数据结构。内容展示如有必要行转列。前端根据题目类型自定义组件后端跟俊题目类型用策略模式校验各种类型这样有统计功能的简单动态问卷就可以了展示时可能某些场景需要行转列。大概估摸使用的话有可能kmic_form_data_detail表的记录数比较大,后期再考虑数据或者表迁移或拆分。

zquwei的博客 3451

flag.parse():命令行参数的传递

参考:https://blog.csdn.net/weixin_43234372/article/details/103752678 flag.parse():主要是把用户传递的命令行参数解析为对应变量的值 原来的 package main import ( "flag" "fmt" "time" ) // 定义命令行参数对应的变量,这四个变量都是指针类型 var cliName = flag.String("name", "John", "Input Your Name") var cliAge

不负韶华,加油! 1563

主流双目相机技术参数横向评测:从ZED到INDEMIND的深度解析

本文对主流双目相机进行了深度横向评测,涵盖ZED、Bumblebee、Leap Motion、DUO 3D及INDEMIND等国内外产品。文章详细解析了分辨率、帧率、视场角、基线等核心参数,并结合科研、机器人导航、无人机、工业检测等典型应用场景,提供了实战选型指南,帮助读者根据具体需求挑选最合适的双目视觉解决方案。

weixin_29212867的博客 640

【kubernetes】kubernetes kubeadm init 错误了 怎么回退?

因为虚拟机设置问题首先报错:然后我根据文章修改了核数。重启后,查看VIP运行所在机器,发现机器没有变化然后重新执行初始化后面报错了根据提供的信息,问题主要集中在 kubelet 未能成功启动控制平面组件,导致初始化过程超时。以下是可能的原因及相应的排查步骤:原因 1:kubelet 未运行或运行状态异常正如错误提示所指出,kubelet 可能未运行或处于不健康状态。请按照提示执行以下命令检查 kubelet 的状态和服务日志:根据输出结果,判断 kubelet 是否正常运行。后续一大堆错误。

九师兄 121

golang flag 包的使用指北

实际上 golang 的 flag 包是用于处理命令行参数的工具包,我们可以基于这个包来开发自定义的命令行工具对于命令行,相信大家都不陌生吧,学过 C 的就知道,如下代码是否很熟悉。

m0_37322399的博客 853

6万字嵌入式最全八股文面试题大全及参考答案(持续更新)

进程上下文定义:进程上下文包含了进程执行时所需的所有信息,包括 CPU 寄存器的值、内核栈、任务控制块(TCB)等。作用:当进程被切换时,需要保存当前进程的上下文,并恢复下一个将要运行进程的上下文。中断上下文定义:中断上下文是指处理中断时 CPU 所处的状态,包括中断发生时的寄存器值等。作用:当中断发生时,CPU 会自动保存当前的上下文信息,并跳转到相应的中断处理程序。示例表格上下文描述进程上下文包含进程执行时的所有相关信息中断上下文处理中断时 CPU 所处的状态线程同步定义。

大模型大数据攻城狮的专栏 7920

Go语言----flag包(导入、配置、以及常用方法Parse()、Parsed()、NArg())

在 Go语言中有很多种方法来处理命令行参数。如果我们只是想简单的获取命令行的参数,可以像中介绍的不使用任何库,直接使用 os.Args;d但是 Golang 的标准库提供了 flag 包来处理命令行参数。

m0_73537205的博客 1232

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Go标准包之flag命令行参数解析

Go标准包之flag命令行参数解析

tangsiqi130的博客 2265

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

GO标准库flag

Go语言内置的flag包实现了命令行参数的解析。 os.Args os.Args是一个[]string类型。 获取命令参数示例: func main() { if len(os.Args) > 0{ for index,args := range os.Args{ fmt.Printf("args[%d]=%v\n", ind...

aiduo4911的博客 191

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

go语言标准库之flag

Go语言内置的flag包实现了命令行参数的解析,flag包使得开发命令行工具更为简单。 os.Args 如果你只是简单的想要获取命令行参数,可以像下面的代码示例一样使用os.Args来获取命令行参数。 package main import ( "fmt" "os" ) //os.Args demo func main() { //os.Args是一个[]string if len(os.Args) > 0 { for index, arg := range os.Args {

weixin_44706011的博客 390

【Go】flag包 命令行参数解析

方法定义了三个命令行参数分别对应字符串、整数和布尔类型的值。这些方法的第一个参数是命令行参数的名称,第二个参数是默认值,第三个参数是参数的说明。你可以根据需要定义更多的命令行参数,并在代码中根据参数值进行相应的逻辑处理。包提供了命令行参数解析的功能,可以方便地从命令行中获取输入参数。方法解析命令行参数,使得我们可以在代码中获取用户提供的参数值。包,你可以定义命令行参数,并解析用户提供的参数值。来获取相应的命令行参数的值,并输出到控制台上。编译并运行以上代码,执行命令。在示例中,我们首先使用。

Fanjufei的博客 415

Go语言-flag包介绍

概述 flag包用来解析,命令行参数 命令行解析方法 举例: package main import ( "flag" "fmt" ) func main(){ value: = flag.String("flagname", "0000", "help message for flagname") flag.Parse() fmt.Printf("%v\n",*value) } ①通过flag.String(), Bool(), Int()等fla.

小K同学 585

Golang命令行输入

引入 对于一些只需要输入几个简单参数的程序来说,直接输入参数并非是一个最好的选择。 事实上,我们可以在用命令行调用这个程序的时候就附带这些参数。 flag包 这个包为我们提供了相关函数,使得我们非常方便地获取命令行参数。 flag.类型 keystr := flag.String("key", "-", "密钥") 通过这个函数,我们可以定义string类型和int类型,其中key是命令行中的输入参数;-为默认值,即没有输入的时候该函数的返回值就是-;密钥是提示,当使用-help的时候会出现。 在命令行中,

lijf2001的博客 952

go 的命令行参数解析--内置模块 flag 学习笔记

import "flag" flag包实现了命令行参数的解析。每个参数认为一条记录,根据实际进行定义,到一个set集合。每条都有各自的状态参数。 在使用flag时正常流程: 1.通过flag.String(), flag.Bool(), flag.Int()等函数来定义命令行中需要使用的参数。 2.在定义完flag后,通过调用flag.Parse()来进行对命令行参数的解析。 3....

吕海洋的博客 253

flag包详解

flag包实现了命令行参数的解析。 使用flag.String(), Bool(), Int()等函数注册flag 下例声明了一个整数和字符串flag,解析结果保存在*int指针num 里 string 保存在name里 num := flag.Int("world",1234,"this is num") name := flag.String("user","xiaoyu","我是小雨") flag.Parse() //在所有flag都注册之后,调用这个函数 默认值就是该变量的初始

小雨的博客 463

go语言学习笔记 — 基础 — 基本数据类型 — 指针(2):使用指针(变量)获取命令行入参信息

package main import ( "flag" "fmt" "testing" ) // 使用flag包,把命令行参数解析传入go代码中提前定义好的一些变量 // 使用flag.String,定义一个mode变量,类型是*string var mode = flag.String("mode", "", "process mode") func main() { flag.Parse() // 解析命令行参数,并把命令行参数值解析入上述变量mode中 fmt.Println(

yjk13703623757的博客 224

在golang中有flag.Parse()和无flag.Parse()区别

1、先看代码 package main import ( "flag" "fmt" "time" ) // 1、定义命令行参数对应的变量,是这四个变量都指针类型 var cliUsername = flag.String("name", "jack", "Input Your Name") var cliAge = flag.Int("age", 18, "Input Your Age") var cliGender = flag.String("gender", "male", "Input Y

知行合一 4187

Elvish flag: 模块完全指南:掌握 Go 约定与 getopt 约定的命令行参数解析

`flag:` 是 Elvish 标准库中用于解析命令行标志(command-line flags)的模块。本文以 [website/ref/flag.md](https://link.gitcode.com/i/809ce81c694348a104c5122c1dbdea7a) 为骨架,结合 [pkg/mods/flag/flag.go](https://link.gitcode.com/i/5

gitblog_01123的博客 333

拖入视频 10 分钟出成片:VideoCaptioner 免费视频字幕生成,零基础小白上手指南

卡卡字幕助手 VideoCaptioner 是一款基于大语言模型(LLM)的开源视频字幕生成工具,把语音识别、断句、校正、翻译到合成一条链全包了。适合自媒体、讲师、访谈剪辑等想给视频加字幕却不想手工对时间轴的人。装完拖入视频,等一会儿就能拿到标准 .srt 字幕,还能一键烧录进成片。 ## 这几类视频用它最省心 - **教程录屏 / 课程制作**:口播多、节奏快,靠机器识别加语义断句,省掉一句

gitblog_00609的博客 640
上一篇: golang的timer的一些坑
下一篇: golang学习之一:变量内存、变量地址、指针变量使用(*、&)
java_xxxx
博客等级 码龄9年 127粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值