Golang Go语言中 flag 标准库的用法问题,Var 函数声明参数是 Value 类型,但是用的时候却需要传递一个 *Value 类型的参数

发布于 1周前 作者 zlyuanteng 来自 Go语言

Golang Go语言中 flag 标准库的用法问题,Var 函数声明参数是 Value 类型,但是用的时候却需要传递一个 *Value 类型的参数

最近在看一些开源 go 项目时,发现大家使用 flag 标准库处理参数时,用 flag.Var(&a, …) 来设置命令行参数,但是我查找 flag 标准库时,发现最终调用的是:

unc Var(value Value, name string, usage string) --> CommandLine.Var(value, name, usage) --> func (f *FlagSet) Var(value Value, name string, usage string)

所以有些疑问,为什么方法第一个参数是 Value 类型,而调用时却需要 *Value 类型?


更多关于Golang Go语言中 flag 标准库的用法问题,Var 函数声明参数是 Value 类型,但是用的时候却需要传递一个 *Value 类型的参数的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

<br>type Value interface {<br> String() string<br> Set(string) error<br>}<br><br>注意,Value 是一个 interface,要求实现 Set 方法.<br><br>举个例子<br>type A string<br><br>func (a A) Set(str string){<br> a = A(str)<br>}<br><br>type B string<br><br>func (b *B) Set(str string) {<br> *b = B(str)<br>}<br>

更多关于Golang Go语言中 flag 标准库的用法问题,Var 函数声明参数是 Value 类型,但是用的时候却需要传递一个 *Value 类型的参数的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


调用时并不是传入 *Value 类型, 而是实现了 Value 接口的对象的指针, 因为参数 Value 是接口类型

所以说,接口类型可以是一个自定义类型,或者是一个指针类型?

在Go语言的flag标准库中,Var函数确实是一个强大的工具,它允许我们定义自定义的命令行标志(flag)。关于你提到的Var函数声明参数是Value类型,但实际使用时需要传递一个*Value类型参数的问题,这里有一个简单的解释:

  1. 接口定义flag.Value是一个接口类型,它定义了一个Set方法,用于设置标志的值。

  2. 指针传递:当你调用flag.Var时,你需要传递一个实现了flag.Value接口的具体类型的指针。这是因为flag包需要在内部修改这个值(例如,当解析命令行参数时)。如果传递的是一个值而不是指针,那么flag包将无法修改原始变量。

  3. 示例

    package main
    
    import (
        "flag"
        "fmt"
    )
    
    type MyFlag struct{}
    
    func (f *MyFlag) Set(value string) error {
        // 实现你的逻辑
        fmt.Println("Set:", value)
        return nil
    }
    
    func (f *MyFlag) String() string {
        // 返回当前值的字符串表示
        return "default"
    }
    
    func main() {
        var myFlag MyFlag
        flag.Var(&myFlag, "myflag", "")
        flag.Parse()
    }
    

在这个例子中,&myFlag是一个指向MyFlag类型变量的指针,它实现了flag.Value接口。这样,flag.Var就可以正确地设置和修改myFlag的值了。

回到顶部