猿问

Golang 使用标志执行函数

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


    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> 

你知道为什么吗?


摇曳的蔷薇
浏览 162回答 2
2回答

慕标5832272

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如果要测试是否word或numb作为 cli 参数提供,请参阅检查 Go 中是否提供了标志。

宝慕林4294392

根据https://pkg.go.dev/flag#StringVarStringVar 定义了一个带有指定名称、默认值和使用字符串的字符串标志。参数 p 指向一个字符串变量,其中存储标志的值。所以这意味着在你的情况下-"foo"将是默认值forwordPtr和for 。42numbPtrfalseforkPtr
随时随地看视频慕课网APP

相关分类

Go
我要回答