2

如何通过输入一个标志来执行特定的功能,例如,我有三个标志:

    wordPtr
    numbPtr
    forkPtr

并且在执行单个时,调用的函数被执行:

.\data -wordPtr Test

执行该标志时,仅执行 word 函数:

package main

import (
    "flag"
    "fmt"
)

var (
    wordPtr string
    numbPtr int
    forkPtr bool
)

func main() {

    flag.StringVar(&wordPtr, "word", "foo", "a string")
    flag.IntVar(&numbPtr, "numb", 42, "an int")
    flag.BoolVar(&forkPtr, "fork", false, "a bool")
    flag.Parse()

    if wordPtr != `` {
        word(wordPtr)
    }

    if numbPtr != 0 {
        numb(numbPtr)
    }

    if forkPtr {
        fork(forkPtr)
    }

}

func word(word string) {
    fmt.Println("word:", word)
}

func numb(numb int) {
    fmt.Println("numb:", numb)
}

func fork(fork bool) {
    fmt.Println("fork:", fork)
}

但是,当我执行最后一个标志时,所有功能都被执行

PS C:\golang> .\logdata.exe -fork
word: foo
numb: 42      
fork: true    
PS C:\golang> 

你知道为什么吗?

4

2 回答 2

1

word您为和标志提供默认值numb,这意味着如果您不将它们作为 cli 参数提供,它们将获得默认值。

并且在flag.Parse()您只测试 if wordPtris not empty 或numbPtris not0之后,并且由于默认值不是这些,因此测试将通过并且函数将被执行。

如果您使用空字符串并0作为默认值:

flag.StringVar(&wordPtr, "word", "", "a string")
flag.IntVar(&numbPtr, "numb", 0, "an int")

然后,如果您不提供这些作为 cli 参数,您的测试将不会通过:

.\logdata.exe -fork

将输出:

fork: true

如果要测试是否wordnumb作为 cli 参数提供,请参阅检查 Go 中是否提供了标志

于 2022-01-25T20:58:29.350 回答
0

根据https://pkg.go.dev/flag#StringVar

StringVar 定义了一个带有指定名称、默认值和使用字符串的字符串标志。参数 p 指向一个字符串变量,其中存储标志的值。

所以这意味着在你的情况下-"foo"将是默认值forwordPtr和for 。42numbPtrfalseforkPtr

于 2022-01-25T20:57:55.840 回答