惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Vulnerabilities – Threatpost
U
Unit 42
F
Fortinet All Blogs
aimingoo的专栏
aimingoo的专栏
P
Proofpoint News Feed
F
Full Disclosure
月光博客
月光博客
Engineering at Meta
Engineering at Meta
博客园_首页
The Register - Security
The Register - Security
G
Google Developers Blog
The Cloudflare Blog
博客园 - Franky
K
Kaspersky official blog
A
Arctic Wolf
Scott Helme
Scott Helme
C
Cisco Blogs
Hugging Face - Blog
Hugging Face - Blog
C
Check Point Blog
NISL@THU
NISL@THU
AI
AI
D
DataBreaches.Net
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Stack Overflow Blog
Stack Overflow Blog
Project Zero
Project Zero
The GitHub Blog
The GitHub Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
量子位
Vercel News
Vercel News
T
Tor Project blog
P
Privacy International News Feed
D
Docker
I
Intezer
L
LangChain Blog
P
Proofpoint News Feed
Security Latest
Security Latest
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threatpost
博客园 - 聂微东
AWS News Blog
AWS News Blog
Martin Fowler
Martin Fowler
P
Privacy & Cybersecurity Law Blog
V
V2EX
Last Week in AI
Last Week in AI
C
Cybersecurity and Infrastructure Security Agency CISA
The Hacker News
The Hacker News
T
Tenable Blog
Blog — PlanetScale
Blog — PlanetScale
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog

博客园 - 黄彬子

【转】Go语言:编译后文件体积过大解决方案 【转】使用 UPX 压缩可执行文件 Go语言获取路径的文件名、后缀 go - 如何将gin模式设置为release模式? 【Golang学习】SVG图片的生成 【Golang踩过的坑】exported function Script should have comment or be unexported wget配置文件的使用:代理设置与不检查证书 Rust Crates 源使用帮助 2020大风口!什么是图神经网络?有什么用?终于有人讲明白了 2020必火的图神经网络(GNN)是什么?有什么用? 【每天学习一点点】Tensorflow 版本与CUDA版本 【每天学习一点点】使用plot_model绘制网络模式失败 【每天学习一点点】keras cifar10.load_data()自己下载数据 【每天学习一点点】Tensorflow2.X 运行问题:Could not create cudnn handle: CUDNN_STATUS_ALLOC_FAILED 【每天学习一点点】mxnet 版本运行失败问题 【每天学习一点点】Tensorflow GPU与CPU版本 【每天学习一点点】不再显示I信息(Tensorflow GPU) 【每天学习一点点】numpy中的reshape中参数为-1 Putty与Xming组合应用
【Golang标准库】flag
黄彬子 · 2022-11-03 · via 博客园 - 黄彬子

参考:

flag学习

Golang Flag包使用介绍

0.前言

一个可执行文件,我们可以使用不同的启动参数来控制程序的行为。如果程序仅仅读取命令行输入来控制程序的行为,那么这个程序的使用体验一定很差。为了提供用户体验,程序的开发者需要给用户提供如下信息:

  1. 启动参数的名称
  2. 启动参数的说明
  3. 启动参数的默认值

Golang中有一个flag包,可以完美解决这个问题。

1.使用方式

示例程序

var (
	name = flag.String("name", "lpc", "go flag test")
)

func main() {
	flag.Parse()
	fmt.Println("hello ", *name)
}

执行结果

$ ./flag-test -h
Usage of ./flag-test:
  -name string
    	 (default "lpc")

$ ./flag-test
hello  lpc

$ ./flag-test -name lpc123
hello  lpc123

在上边的示例程序中,有三个比较重要的步骤:

  1. 设置
  2. 解析
  3. 使用
// 设置命令行参数名称,默认值,使用说明
name = flag.String("name", "lpc", "go flag test") 

// 解析命令行参数
flag.Parse()

// 使用。name是一个指针,需要根据指针解引用,来获取真实的值
fmt.Println("hello ", *name)

2.原理介绍

上一节简单介绍了flag包的使用,其背后的原理也很值得大家思考。

首先需要理解FlagSet的概念,FlagSet的官方定义如下:

A FlagSet represents a set of defined flags.

直译就是FlagSet代表一个flag的集合。

在具备FlagSet概念之后,我们再来回顾Flag的使用。

  • 设置阶段,就是往FlagSet中插入一条flag记录,返回一个指向flag所代表的值的指针,flag记录中包括默认值,flag名称,用法;
  • 解析阶段,根据程序实际运行时参数的指定,覆盖默认值;
  • 使用阶段,根据设置阶段返回的指针,来获取flag的值。

3.总结

flag包是Golang的官方包,有很多有趣的程序是在flag包上进行开发的,比如spf13/cobra感兴趣的朋友可以研究一下,很精彩。