亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在go中聲明一個沒有值的全局變量

在go中聲明一個沒有值的全局變量

Go
Helenr 2023-05-08 15:05:52
我有一個程序需要 1 個或 2 個參數,具體取決于用戶想要運行的內容var (   clientSet = tools.NewClientSet(os.Args[2]))func main {    if os.Args[1] == "validate" {       // run validate function, no need for user to have os.Args[2]    }else if os.Args[1] == "sync" {      // run sync function that requires os.Args[2]    }}func foo{   tools.Manage(clientSet)}我需要clientSet變量是全局的,但如果用戶只想使用驗證函數,我不需要用戶擁有 os.Args[2]。將函數放在clientSet里面main()會使我的foo()函數損壞,并且我無法聲明一個具有空值的變量。所以我希望我的用戶能夠順利go run main.go validate運行go run main.go sync production。*生產是一個任意值我可以讓我的用戶運行來go run main.go validate _解決這個問題,但那會很不雅觀。解決這個問題的最佳方法是什么?
查看完整描述

3 回答

?
呼啦一陣風

TA貢獻1802條經驗 獲得超6個贊

在這種情況下,我什至不認為需要全局變量。您可以讓同步功能接受一個ClientSeteg func sync(c ClientSet)。但是如果你真的需要全局變量,那么你不應該這樣做,除非你希望你的程序在沒有參數存在時發生恐慌。


var (

   clientSet = tools.NewClientSet(os.Args[2])

)

您應該做的是為它分配一個默認值或您的類型的零值。


var (

   clientSet tools.ClientSet

)

您的主要功能看起來像這樣:


var (

    clientSet tools.ClientSet

)


func main() {


    if len(os.Args) < 2 {

        os.Exit(1)

    }


    switch os.Args[1] {

    case "validate":

        validate()


    case "sync":


        if len(os.Args) < 3 {

            os.Exit(1)

        }


        clientSet = tools.NewClientSet(os.Args[2])

        sync()

    default:

        // place your default case here

    }


}

盡管如此,我還是建議您將 a 傳遞ClientSet給 sync 函數,因為它會避免使用全局變量。


查看完整回答
反對 回復 2023-05-08
?
瀟瀟雨雨

TA貢獻1833條經驗 獲得超4個贊

答案通常是不使用全局變量。取而代之的是foo接受一個參數foo(clientSet ClientSet)并僅在需要時實例化它。



查看完整回答
反對 回復 2023-05-08
?
收到一只叮咚

TA貢獻1821條經驗 獲得超5個贊

只需使用len(os.Args)函數


var (

    clientSet tools.ClientSet

)


func main() {

    if len(os.Agrs) == 1 {

        // just the file name

    } else if len(os.Args) == 2 {

        if os.Args[1] == "validate" {

            // run validate function, no need for user to have os.Args[2]

        } else if os.Args[1] == "sync" {

            // sync with no argument show error

        }

    } else if len(os.Args) == 3 {

        if os.Args[1] == "validate" {

            clientSet = tools.NewClientSet(os.Args[2])

        } else {

            // non validate with the second arg

        }

    } else {

        // else, if required

    }

}

盡管我建議您不要使用全局變量。盡可能避免。


查看完整回答
反對 回復 2023-05-08
  • 3 回答
  • 0 關注
  • 193 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號