flag - 命令行参数解析(go中的gflags)

Gflags的使用 在实际工程代码开发中,发现gflags很好用,可以在运行。 阅读详情

copy from https://books.studygolang.com/The-Golang-Standard-Library-by-Example/chapter13/13.1.html

在写命令行程序(工具、server)时,对命令参数进行解析是常见的需求。各种语言一般都会提供解析命令行参数的方法或库,以方便程序员使用。如果命令行参数纯粹自己写代码来解析,对于比较复杂的,还是挺费劲的。在 go 标准库中提供了一个包:flag,方便进行命令行解析。

首先,我们看flag包可以做什么,它具有什么样的能力。

1.1 使用示例:

  • 我们以 nginx为例,执行 nginx -h,输出如下:
nginx version: nginx/1.10.0
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]

Options:
  -?,-h         : this help
  -v            : show version and exit
  -V            : show version and configure options then exit
  -t            : test configuration and exit
  -T            : test configuration, dump it and exit
  -q            : suppress non-error messages during configuration testing
  -s signal     : send signal to a master process: stop, quit, reopen, reload
  -p prefix     : set prefix path (default: /usr/local/nginx/)
  -c filename   : set configuration file (default: conf/nginx.conf)
  -g directives : set global directives out of configuration file

后续我们会利用flag包实现一个并发测试接口的程序。
现在我们来利用flag包简单实现一下nginx -h这个功能:

package main

import (
    "flag"
    "fmt"
    "os"
)

// 实际中应该用更好的变量名
var (
    h bool

    v, V bool
    t, T bool
    q    *bool

    s string
    p string
    c string
    g string
)

func init() {
    flag.BoolVar(&h, "h", false, "this help")

    flag.BoolVar(&v, "v", false, "show version and exit")
    flag.BoolVar(&V, "V", false, "show version and configure options then exit")

    flag.BoolVar(&t, "t", false, "test configuration and exit")
    flag.BoolVar(&T, "T", false, "test configuration, dump it and exit")

    // 另一种绑定方式
    q = flag.Bool("q", false, "suppress non-error messages during configuration testing")

    // 注意 `signal`。默认是 -s string,有了 `signal` 之后,变为 -s signal
    flag.StringVar(&s, "s", "", "send `signal` to a master process: stop, quit, reopen, reload")
    flag.StringVar(&p, "p", "/usr/local/nginx/", "set `prefix` path")
    flag.StringVar(&c, "c", "conf/nginx.conf", "set configuration `file`")
    flag.StringVar(&g, "g", "conf/nginx.conf", "set global `directives` out of configuration file")

    // 改变默认的 Usage,flag包中的Usage 其实是一个函数类型。这里是覆盖默认函数实现,具体见后面Usage部分的分析
    flag.Usage = usage
}

func main() {
    flag.Parse()

    if h {
        flag.Usage()
    }
}

func usage() {
    fmt.Fprintf(os.Stderr, `nginx version: nginx/1.10.0
Usage: nginx [-hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]

Options:
`)
    flag.PrintDefaults()
}

nginx功能用go实现结果

看不懂以上的代码实现没关系,先明确flag的能力,看完下面的讲解回过头来看就可以看懂了。

1.2 flag 包概述

flag 包实现了命令行参数的解析。

1.2.1 定义 flags 有两种方式

1)flag.Xxx(),其中 Xxx 可以是 Int、String,Bool 等;返回一个相应类型的指针,如:
var ip = flag.Int("flagname", 1234, "help message for flagname")

  • 第一个参数 :flag名称为flagname
  • 第二个参数 :flagname默认值为1234
  • 第三个参数 :flagname的提示信息

返回的ip是指针类型,所以这种方式获取ip的值应该fmt.Println(*ip)

2)flag.XxxVar(),将 flag 绑定到一个变量上,如:

var flagValue int
flag.IntVar(&flagValue, "flagname", 1234, "help message for flagname")
  • 第一个参数 :接收flagname的实际值的
  • 第二个参数 :flag名称为flagname
  • 第三个参数 :flagname默认值为1234
  • 第四个参数 :flagname的提示信息
    这种方式获取ip的值fmt.Println(ip)就可以了:

1.2.2 自定义 Value

另外,还可以创建自定义 flag,只要实现 flag.Value 接口即可(要求 receiver是指针),这时候可以通过如下方式定义该 flag:

flag.Var(&flagVal, "name", "help message for flagname")

例如,解析我喜欢的编程语言,我们希望直接解析到 slice 中,我们可以定义如下 sliceValue类型,然后实现Value接口:

package main

import (
    "flag"
    "fmt"
    "strings"
)

//定义一个类型,用于增加该类型方法
type sliceValue []string

//new一个存放命令行参数值的slice
func newSliceValue(vals []string, p *[]string) *sliceValue {
    *p = vals
    return (*sliceValue)(p)
}

/*
Value接口:
type Value interface {
    String() string
    Set(string) error
}
实现flag包中的Value接口,将命令行接收到的值用,分隔存到slice里
*/
func (s *sliceValue) Set(val string) error {
    *s = sliceValue(strings.Split(val, ","))
    return nil
}

//flag为slice的默认值default is me,和return返回值没有关系
func (s *sliceValue) String() string {
    *s = sliceValue(strings.Split("default is me", ","))
    return "It's none of my business"
}

/*
可执行文件名 -slice="java,go"  最后将输出[java,go]
可执行文件名 最后将输出[default is me]
 */
func main(){
    var languages []string
    flag.Var(newSliceValue([]string{}, &languages), "slice", "I like programming `languages`")
    flag.Parse()

    //打印结果slice接收到的值
    fmt.Println(languages)
}

这样通过 -slice "go,php"这样的形式传递参数,languages得到的就是 [go, php]。如果不加-slice参数则打印默认值[default is me]

flag 中对 Duration这种非基本类型的支持,使用的就是类似这样的方式,即同样实现了Value接口。

1.2.3 解析 flag

在所有的 flag 定义完成之后,可以通过调用 flag.Parse()进行解析。

命令行 flag 的语法有如下三种形式:

-flag // 只支持bool类型
-flag=x
-flag x // 只支持非bool类型

以上语法对于一个或两个‘-’号,效果是一样的,但是要注意对于第三种情况,只能用于非 bool 类型的 flag。原因是:如果支持,那么对于这样的命令 cmd -x *,如果有一个文件名字是:0或false等,则命令的原意会改变(bool 类型可以和其他类型一样处理,其次 bool 类型支持 -flag这种形式,因为Parse()中,对 bool 类型进行了特殊处理)。默认的,提供了 -flag,则对应的值为 true,否则为 flag.Bool/BoolVar中指定的默认值;如果希望显示设置为 false 则使用 -flag=false。

int 类型可以是十进制、十六进制、八进制甚至是负数;bool 类型可以是1, 0, t, f, true, false, TRUE, FALSE, True, False。Duration 可以接受任何 time.ParseDuration 能解析的类型。

  • 注:如果bool类型的参数在命令行中用了-flag false这种形式时,其后的参数都会被当做非flag(non-flag)参数,non-flag 参数后面解释。

1.3 类型和函数

在看类型和函数之前,先看一下变量。

ErrHelp:该错误类型用于当命令行指定了 ·-help` 参数但没有定义时。

例如1.2.2例子中:如果执行时用了-help或者-h时就会输出help message:

Usage of myflag.exe:
  -slice languages
        I like programming languages

Usage:这是一个函数,用于输出所有定义了的命令行参数和帮助信息(usage message)。一般,当命令行参数解析出错时,该函数会被调用。我们可以指定自己的 Usage 函数,即:flag.Usage = func(){}

例如1.1示例中:如果执行时用了-help时就会输出和-h一样的usage message。

1.3.1 函数

go标准库中,经常这么做:

定义了一个类型,提供了很多方法;为了方便使用,会实例化一个该类型的实例(通用),这样便可以直接使用该实例调用方法。比如:encoding/base64 中提供了 StdEncoding 和 URLEncoding 实例,使用时:base64.StdEncoding.Encode()

在 flag 包使用了有类似的方法,比如 CommandLine 变量,只不过 flag 进行了进一步封装:将 FlagSet 的方法都重新定义了一遍,也就是提供了一系列函数,而函数中只是简单的调用已经实例化好了的 FlagSet 实例:CommandLine 的方法。这样,使用者是这么调用:flag.Parse() 而不是 flag. CommandLine.Parse()。(Go 1.2 起,将 CommandLine 导出,之前是非导出的)

这里不详细介绍各个函数,其他函数介绍可以参考astaxie的gopkg——flag章节。

1.3.2 类型(数据结构)

1)ErrorHandling

type ErrorHandling int

该类型定义了在参数解析出错时错误处理方式。定义了三个该类型的常量:

const (
    ContinueOnError ErrorHandling = iota
    ExitOnError
    PanicOnError
)

三个常量在源码的 FlagSet 的方法 parseOne() 中使用了。

2)Flag

// A Flag represents the state of a flag.
type Flag struct {
    Name     string // name as it appears on command line
    Usage    string // help message
    Value    Value  // value as set
    DefValue string // default value (as text); for usage message
}

Flag 类型代表一个 flag 的状态。

比如,对于命令:./nginx -c /etc/nginx.conf,相应代码是:

flag.StringVar(&c, "c", "conf/nginx.conf", "set configuration `file`")

则该 Flag 实例(可以通过 flag.Lookup("c")获得)相应各个字段的值为:

&Flag{
    Name: c,
    Usage: set configuration file,
    Value: /etc/nginx.conf,
    DefValue: conf/nginx.conf,
}

Lookup函数:获取flag集合中名称为name值的flag指针,如果对应的flag不存在,返回nil
示例:

package main

import (
    "flag"
    "fmt"
)

//定义一个全局变量的命令行接收参数
var testFlag = flag.String("test", "default value", "help message.")

//打印值的函数
func print(f *flag.Flag) {
    if f != nil {
        fmt.Println(f.Value)
    } else {
        fmt.Println(nil)
    }
}

func main() {
    //没有用flag.Parse()解析前
    fmt.Print("test:")
    print(flag.Lookup("test"))
    fmt.Print("test1:")
    print(flag.Lookup("test1"))

    //用flag.Parse()解析后
    flag.Parse()
    fmt.Print("test:")
    print(flag.Lookup("test"))
    fmt.Print("test1:")
    print(flag.Lookup("test1"))
}

运行结果:

//  ./testlookup -test "12345"      
test:default value
test1:<nil>
test:12345
test1:<nil>

3)FlagSet

// A FlagSet represents a set of defined flags.
type FlagSet struct {
    // Usage is the function called when an error occurs while parsing flags.
    // The field is a function (not a method) that may be changed to point to
    // a custom error handler.
    Usage func()

    name string // FlagSet的名字。CommandLine 给的是 os.Args[0]
    parsed bool // 是否执行过Parse()
    actual map[string]*Flag // 存放实际传递了的参数(即命令行参数)
    formal map[string]*Flag // 存放所有已定义命令行参数
    args []string // arguments after flags // 开始存放所有参数,最后保留 非flag(non-flag)参数
    exitOnError bool // does the program exit if there's an error?
    errorHandling ErrorHandling // 当解析出错时,处理错误的方式
    output io.Writer // nil means stderr; use out() accessor
}

4)Value 接口

// Value is the interface to the dynamic value stored in a flag.
// (The default value is represented as a string.)
type Value interface {
    String() string
    Set(string) error
}

所有参数类型需要实现 Value 接口,flag 包中,为int、float、bool等实现了该接口。借助该接口,我们可以自定义flag。(上文已经给了具体的例子)

1.4 主要类型的方法(包括类型实例化)

flag 包中主要是 FlagSet 类型。

1.4.1 实例化方式

NewFlagSet()用于实例化 FlagSet。预定义的 FlagSet 实例 CommandLine的定义方式:

// The default set of command-line flags, parsed from os.Args.
var CommandLine = NewFlagSet(os.Args[0], ExitOnError)

可见,默认的 FlagSet 实例在解析出错时会退出程序。

由于 FlagSet 中的字段没有 export,其他方式获得 FlagSet实例后,比如:FlagSet{} 或 new(FlagSet),应该调用Init() 方法,以初始化 name 和 errorHandling,否则 name 为空,errorHandling 为 ContinueOnError(errorHandling默认为0)。

1.4.2 定义 flag 参数的方法

这一系列的方法都有两种形式,在一开始已经说了两种方式的区别。这些方法用于定义某一类型的 flag 参数。

1.4.3 解析参数(Parse)

func (f *FlagSet) Parse(arguments []string) error

从参数列表中解析定义的 flag。方法参数 arguments 不包括命令名,即应该是os.Args[1:]。事实上,flag.Parse()函数就是这么做的:

// 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:])
}

该方法应该在 flag 参数定义后而具体参数值被访问前调用。

如果提供了 -help参数(命令中给了)但没有定义(代码中没有),该方法返回 ErrHelp错误。默认的 CommandLine,在 Parse 出错时会退出程序(ExitOnError)。

为了更深入的理解,我们看一下 Parse(arguments []string)的源码:

func (f *FlagSet) Parse(arguments []string) error {
    f.parsed = true
    f.args = arguments
    for {
        seen, err := f.parseOne()
        if seen {
            continue
        }
        if err == nil {
            break
        }
        switch f.errorHandling {
        case ContinueOnError:
            return err
        case ExitOnError:
            os.Exit(2)
        case PanicOnError:
            panic(err)
        }
    }
    return nil
}

真正解析参数的方法是非导出方法 parseOne。

结合 parseOne方法,我们来解释 non-flag以及包文档中的这句话:

Flag parsing stops just before the first non-flag argument ("-" is a non-flag argument) or after the terminator "--".

我们需要了解解析什么时候停止。

根据 Parse() 中 for 循环终止的条件(不考虑解析出错),我们知道,当 parseOne 返回 false, nil时,Parse 解析终止。正常解析完成我们不考虑。看一下 parseOne 的源码发现,有三处会返回 false, nil。
在这里先说一下non-flag命令行参数是指不满足命令行语法的参数,如命令行参数为cmd -flag=true abc则第一个非flag命令行参数为“abc”

1)参数列表长度为0

if len(f.args) == 0 {
        return false, nil
}

2)第一个 non-flag 参数

s := f.args[0]
if len(s) == 0 || s[0] != '-' || len(s) == 1 {
    return false, nil
}

也就是,当遇到单独的一个"-"或不是"-"开始时,会停止解析。比如:

./nginx - 或 ./nginx ba或者./nginx

这两种情况,-c都不会被正确解析。像该例子中的"-"或ba(以及之后的参数),我们称之为 non-flag参数。

3)两个连续的"--"

if s[1] == '-' {
    num_minuses++
    if len(s) == 2 { // "--" terminates the flags
        f.args = f.args[1:]
        return false, nil
    }
}

也就是,当遇到连续的两个"-"时,解析停止。如:

./nginx --

*下面这种情况是可以正常解析的:

./nginx -c --

这里的"--"会被当成是 c的值

parseOne 方法中接下来是处理 -flag=x这种形式,然后是 -flag这种形式(bool类型)(这里对bool进行了特殊处理),接着是 -flag x这种形式,最后,将解析成功的 Flag 实例存入 FlagSet 的 actual map 中。

另外,在 parseOne 中有这么一句:

f.args = f.args[1:]

也就是说,每执行成功一次 parseOne,f.args 会少一个。所以,FlagSet 中的 args 最后留下来的就是所有 non-flag参数。

1.4.4 Arg(i int) 和 Args()、NArg()、NFlag()

Arg(i int) 和 Args() 这两个方法就是获取 non-flag参数的;NArg()获得 non-flag的个数;NFlag() 获得 FlagSet 中 actual 长度(即被设置了的参数个数)。

1.4.5 Visit/VisitAll

这两个函数分别用于访问 FlatSet 的 actual(存放参数值实际Flag的map) 和 formal(存放参数名默认Flag的map) 中的 Flag,而具体的访问方式由调用者决定。

具体使用demo见:
func (f FlagSet) Visit(fn func(Flag))
func (f FlagSet) VisitAll(fn func(Flag))

1.4.6 PrintDefaults()

打印所有已定义参数的默认值(调用 VisitAll 实现),默认输出到标准错误,除非指定了 FlagSet 的 output(通过SetOutput() 设置)。
在1.1示例中有使用。还可以参考:
func PrintDefaults()

1.4.7 Set(name, value string)

将名称为name的flag的值设置为value, 成功返回nil。
demo请见:
func Set(name, value string) error

1.5 总结

使用建议:虽然上面讲了那么多,一般来说,我们只简单的定义flag,然后 parse,就如同开始的例子一样。

如果项目需要复杂或更高级的命令行解析方式,可以使用 https://github.com/urfave/cli或者 https://github.com/spf13/cobra这两个强大的库。



作者:我的小碗汤
链接:https://www.jianshu.com/p/f9cf46a4de0e
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

Golang flag包使用指南:让你的程序支持命令行参数 在软件开发过程中,命令行参数的使用是非常常见的。通过命令行参数,用户可以在程序启动时动态地传递一些配置信息,从而使程序具有更高的灵活性和可配置性。Golang的flag包为开发者提供了一种简单而强大的方式来处理命令行参数。本文的目的是全面介绍Golang flag包的使用方法,涵盖从基础概念到实际项目应用的各个方面,帮助开发者能够熟练运用flag包来实现程序对命令行参数的支持。 阅读详情

相关推荐

【gflags处理命令行参数的库运行程序时如何给定参数】

(之前称为Google Commandline Flags)是一个用于处理命令行参数的库。在很多C++项目中,特别是由Google开发的项目中,你会经常看到它的身影。但你可以为每个flag定义两次,一次是长格式,一次是短格式。当你使用gflags定义了一些命令行参数后,在运行程序时可以很方便地给定这些参数。要注意,gflags会解析传入的命令行参数,所以你在调用。所以你可以将未处理的参数传递给其他部分的代码或其他库。选项,gflags会列出所有的flags及其描述。只会包含gflags没有处理的参数。

小秋 AI SLAM 入门实战教程 293

Golang之flag包的使用

1.1 flag简介 import “flag” flag包实现了命令行参数的解析。 要求: 使用flag.String(), Bool(), Int()等函数注册flag,下例声明了一个整数flag,解析结果保存在*int指针ip里: import "flag" var ip = flag.Int("flagname", 1234, "help message for flagname") 如...

BigData_Mining的博客 2537

ADG同步性能优化:如何正确配置standby redolog避免WAIT_FOR_LOG状态

本文深入剖析了Oracle ADG(Active Data Guard)同步中常见的WAIT_FOR_LOG状态,指出其根源在于Standby Redo Log(SRL)配置不当。文章提供了从诊断到优化的完整实践指南,重点阐述了SRL大小匹配、组数充足等黄金配置法则,帮助架构师从根本上避免同步延迟,实现稳定高效的实时数据同步。

weixin_29200485的博客 333

golang flag

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34107739的博客 421

SE (3) -Transformers:三维旋转 - 平移等变注意力网络

E (3) 变换器,这是一种用于三维点云和图的自注意力模块变体,在连续三维旋转平移下具有等变性。注意力机制的计算量会随着点云规模的增大呈二次方增长,因此引入邻域的概念是很有必要的:每个点不再关注所有其他点,而只关注其最近的邻点。注意力机制此前已在图的领域中以内部注意力、自注意力、顶点注意力或图注意力等名称被引入 [17, 31, 32, 12, 26]。等变性意味着当输入数据发生旋转或平移时,模型的输出也会以相应的、可预测的方式进行变换,从而保证模型性能的稳定性和可预测性。

qq_49786473的博客 1479

300个fpga练手项目推荐

• 按键设置BPM,LED和蜂鸣器同步打拍(支持4/4、3/4拍)• 例:先实现DDR3控制器(基础),再构建视频处理流水线(集成)◦ 驱动小型e-Paper显示日期/时间(SPI接口,静态刷新)◦ 音频输入经FFT后,用LED柱状显示频率能量(8频段简化)◦ 通过HC-05模块接收手机指令,控制电机方向(前进/后退)• 随机点亮LED,用按钮响应,数码管显示反应时间(毫秒级)• 8个LED旋转闪烁,按钮停止后显示中奖编号(带减速动画)• 用4方向按键输入手势(如→→←↑),正确后点亮绿色LED。

qq_62784677的博客 7637

[Golang flag]命令行参数解析及flag包详解

这篇文章带大家学习了一遍golang提供的flag包,学完后就会各种花式写命令行程序了。

夏日白云的boke 7195

竞拍算法(Auction Algorithm)原理及工作过程分析

因一些项目工作需要对竞拍算法进行深入了解。但百度了大部分资料都未找到一篇文章能对此算法进行较为深入的介绍。在一番努力之下,终于找打了最初提出该算法的论文,本文内容主要结合该论文对竞拍算法进行分析。 竞拍算法简介 竞拍算法(Auction Algorithm)是一种用于解决分配问题的分布式算法,经相关文献查询,最早由麻省理工学院信息和决策系统实验室的Bertsekas(教授?)提出 1,于1988年发表于期刊Annals of Operations Research。 顾名思义,竞拍算法本质就是模拟人类拍.

weixin_47546390的博客 3万+

Go学习笔记------flag

flag包用来处理命令行参数,以下是基本用法,具体可查询文档。 package main import ( &quot;flag&quot; &quot;fmt&quot; &quot;os&quot; &quot;strconv&quot; &quot;strings&quot; ) type my struct { i int } func (v *my)

yijiull 522

fastbin attack快速入门

0x01 fastbin简介 Fastbin包含0x20~0x80大小bin的数组指针,用于快速分配小堆块。fastbin按照单链表结构进行组织,相同大小的bin在同一个链表中,fd指向下一个bin,采用LIFO(Last In First Out)机制。在fastbin中,堆块的inuse标志都为1,处于占用状态,防止chunk释放时进行合并,加快小堆块的分配。 正常fastbin的使用 通过这个简单的案例来了解fastbin的单链表结构,malloc和free的过程。 #include<stdio

abelxu 1571

从Excel到‘一张图’办案:手把手教你用AbutionGraph构建公安经侦知识图谱(含数据建模避坑指南)

本文详细介绍了如何利用AbutionGraph时序图数仓技术,将公安经侦领域的Excel、银行流水等碎片化数据转化为可交互的知识图谱。通过数据清洗、实体关系模型设计、时序数据处理等步骤,实现高效智能分析,提升办案效率。特别包含数据建模避坑指南和实战案例,助力公安金融案件侦破。

weixin_33702545的博客 340

【gflags】【gflags实践】【gflags的学习使用记录】

gflags是google开源的一套命令行参数解析工具。通常在项目开发中会有一种需求:可以在代码运行的时候指定某些代码中某些参数的值如果没有显式指定,这些参数可以使用默认的值如,这个宏的三个参数分别是:参数:参数名参数:参数的默认值参数:参数的说明gflags支持以下参数类型。.........

qq_45954434的博客 1414

【即插即用模块】注意力篇 | ECCV 2024 | DPB:高低频动态分离+双提示融合,PSNR直冲40+!

本文提出了一种基于频率提示的图像恢复方法FPro,通过动态滤波器分离输入特征的高低频分量,并采用双提示块(DPB)进行频域专属提示生成与调制。DPB包含低频提示调制器(LPM)和高频提示调制器(HPM),分别处理不同频段信号,通过生成提示组件并融合解码器特征来优化恢复效果。实验表明,该方法在U型结构中表现优异,尤其适用于分割、底层视觉和多模态任务。模块通过动态无监督频率分离、频域专属提示生成和适配性融合机制,有效解决了传统方法对频域信息关注不足的问题,显著提升了图像恢复质量。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 146

ubuntu下Gflags安装、配置、使用

一、基础知识 1、Gflags是一种命令行解析工具(处理命令行参数的库),主要用于解析用命令行执行可执行文件时传入的参数。在gflags中flag可以分散的定义在各个文件之中,而不用定义在一起,这就意味着在我们可以在一个单独的文件中只定义这个文件所需要用到的一些flag,链接了该文件应用都可以使用该文件中的flag,这样就能非常方便的实现代码的复用,如果不同的文件定义了相同的flag,则会产生错误,所以需要明确规范gflags的使用规范。 2、gflags支持的参数类型如下 DEFINE...

灰太狼的小秘密 1万+

基于NRF52833芯片的DW3000 SPI驱动接口代码实现

详细介绍基于NRF52833、nRF52820 、nRF52832 nRF52840 芯片的DW3000 硬件驱动接口代码

DT程序员的博客 1214

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

gflags核心原理:深入解析DEFINE/DECLARE宏的实现机制

gflags是Google开发的一个强大命令行参数解析库,它通过巧妙的宏定义机制让命令行参数管理变得简单高效。本文将深入探讨gflags中DEFINE_*和DECLARE_*宏的实现原理,帮助你真正理解这个优秀工具的内部工作机制。🚀 ## gflags宏系统架构解析 gflags的核心在于其精巧的宏定义系统。在[src/gflags.h.in](https://link.gitcode.co

gitblog_01149的博客 958

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

google好用的gFlags——解析命令行参数(支持c++和python)

一、简介 GFlags是Google开源的一套命令行参数处理的开源库,包括C++的版本和python 版本。 和 getopt() 之类的库不同,flag的定义可以散布在各个源码中,而不用放在一起。一个源码文件可以定义一些它自己的flag,链接了该文件的应用都能使用这些flag。这样就能非常方便地复用代码。如果不同的文件定义了相同的flag,链接时会报错。 二、在程序中定义Flags 定义一个flag是简单的:只需要使用你想用的类型的相应的宏就可以。 example: // foo.cc #inc

哦,原来你也在这里。 2079

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Google Gflags 使用

Gflags是谷歌开发的命令行参数解析工具,支持分散定义参数(通过DEFINE_系列宏),不同文件可独立定义所需参数,实现代码复用。需注意避免重复定义冲突。安装后包含头文件即可使用,通过FLAGS_前缀访问参数值,调用ParseCommandLineFlags解析命令行输入。支持显式(args字符串)和隐式(直接命令行)两种传参方式。相较于getopt(),gflags具有更好的模块化和复用性,但需规范使用以避免定义冲突。

人无远虑,必有近忧 817

GFlags使用文档

GFlags是Google开源的一个命令行flag(区别于参数)库。和getopt()之类的库不同,flag的定义可以散布在各个源码中,而不用放在一起。一个源码文件可以定义一些它自己的flag,链接了该文件的应用都能使用这些flag。这样就能非常方便地复用代码。如果不同的文件定义了相同的flag,链接时会报错。 GFlags是一个C++库,同时也有一个Python移植,使用完全相同的接口。 ...

大隐隐于野 1605

谷歌命令行解析工具gflags的使用

谷歌命令行解析工具gflags的使用 Gflags简介 GFlags是Google开源的一套命令行参数处理的开源库。 在一个源码文件定义的flag,链接了该文件的应用就可以使用该flag,可以方便的复用代码。 如果不同的文件定义了相同的flag,链接时会报错。 可参考下面链接进行安装 https://github.com/gflags/gflags/blob/master/INSTALL.md ​github.com/gflags/gflags/blob/master/INSTALL.md 使用 举例说明

mmqluo的博客 1436

gflags-命令行参数库超详细使用教程

本文介绍了Google开源的C++命令行参数管理库gflags的基本使用方法。gflags通过宏定义简化参数声明,支持多种数据类型,自动生成帮助文档,并能从命令行或配置文件读取参数。主要内容包括:安装方法、基础使用(参数定义、访问和解析)、进阶功能(跨文件访问、多种传参方式、配置文件加载)以及完整示例演示。该库能有效替代手动解析命令行参数,提高开发效率和代码可维护性,是C++项目中处理配置参数的实用工具。

WWTYYDS_666的博客 187

关于gflags的使用学习笔记

一、介绍 gflags是google的一个开源的处理命令行参数的库,使用c++开发。 ubuntu下使用命令安装: sudo apt-get install libgflags* 二、关键点 1、DEFINE宏有三个参数:标志的名称、默认值以及描述其用法的字符串。 2、定义的flag可以像正常的变量一样使用,只需在前面加上 FLAGS_前缀。 3、可以在任何源文件中定义flag,但是每个只能定义一...

weijie1984222的博客 276

【亲测免费】 gflags 库安装与使用教程

`gflags` 的源代码库包含了以下主要目录: - `include`: 存放头文件,供在您的项目中包含 gflags 功能。 - `src`: 源代码目录,包含实现 gflags 功能的 C++ 文件。 - `cmake`: 使用 CMake 进行构建系统的配置文件。 - `examples`: 示例程序,演示如何在实际项目中使用 gflags。 - `test`: 测试用例,用于验证 gf

gitblog_00946的博客 1083

GFlags使用文档 

GFlags是Google开源的一个命令行flag(区别于参数)库。和getopt()之类的库不同,flag的定义可以散布在各个源码中,而不用放在一起。一个源码文件可以定义一些它自己的flag,链接了该文件的应用都能使用这些flag。这样就能非常方便地复用代码。如果不同的文件定义了相同的flag,链接时会报错。 GFlags是一个C++库,同时也有一个Python移植,使用完全相同的接口。 ...

大隐隐于野 635

Gflags简单使用

gflags的简单使用,真的超坤简单!

Done_for_me的博客 803

google gflags命令行参数处理(c++)

google gflags介绍 它可以直接从命令行中提取预定义好的参数。 宏定义 例子: // test.cpp #include <gflags/glags.h> // 三个参数:1.定义的参数名;2.默认值;3.提示语句 DEFINE_string(query, "", "The keyword you need to query"); DEFINE_uint64(search_type, 0, "It is the businessType. You can see the details

江江的博客 429
上一篇: openssl编译成静态库被程序所依赖
下一篇: 路由查找之Radix Tree
whkdsb
博客等级 码龄12年 0粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值