2012-03-02 11 views
6

これは馬鹿に聞こえるかもしれませんが、Goでグローバル変数を定義するにはどうすればよいですか? const myglobalvariable = "Hi there!"は実際には機能しません...グローバル変数/コマンドライン引数を取得してそれを出力する

私はコマンドライン引数を取得したいと思いますが、その後は印刷したいと思います。

package main 

import (
    "flag" 
    "fmt" 
) 

func main() { 
    gettext(); 
    fmt.Println(text) 
} 

func gettext() { 
    flag.Parse() 
    text := flag.Args() 
    if len(text) < 1 { 
     fmt.Println("Please give me some text!") 
    } 
} 

問題は、私は...私はconst myglobalvariable = "Hi there!"を使用して、グローバル変数を宣言について考えたが、私はちょうどエラーcannot use flag.Args() (type []string) as type ideal string in assignment ... を得るように、それだけで空行を表示していることである:私はこの本のコードスニペットを使用してくださいあなたが私に助けてくれることを願っています。

答えて

-5

なぜグローバル変数が必要ですか?例えば、

package main 

import (
    "flag" 
    "fmt" 
) 

func main() { 
    text := gettext() 
    fmt.Println(text) 
} 

func gettext() []string { 
    flag.Parse() 
    text := flag.Args() 
    if len(text) < 1 { 
     fmt.Println("Please give me some text!") 
    } 
    return text 
} 
+0

私はそれは、彼らがこれは本当に怠惰な答えである –

25

少なくとも2つの質問がありますが、3つあります。

  1. どのようにグローバル変数を宣言しますか?
  2. グローバル定数をどのように宣言しますか?
  3. コマンドラインオプションと引数をどのように解析しますか?

以下のコードは、これを有用な方法で示してくれることを願っています。フラッグパッケージは、私がGoで歯を切っていた最初のパッケージの1つでした。当時は明らかではなかったが、ドキュメンテーションは改善している。

参考資料として、この執筆時点ではhttp://weekly.golang.orgを参考にしています。メインサイトは古すぎます。

package main 

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

//This is how you declare a global variable 
var someOption bool 

//This is how you declare a global constant 
const usageMsg string = "goprog [-someoption] args\n" 

func main() { 
    flag.BoolVar(&someOption, "someOption", false, "Run with someOption") 
    //Setting Usage will cause usage to be executed if options are provided 
    //that were never defined, e.g. "goprog -someOption -foo" 
    flag.Usage = usage 
    flag.Parse() 
    if someOption { 
     fmt.Printf("someOption was set\n") 
    } 
    //If there are other required command line arguments, that are not 
    //options, they will now be available to parse manually. flag does 
    //not do this part for you. 
    for _, v := range flag.Args() { 
     fmt.Printf("%+v\n", v) 
    } 

    //Calling this program as "./goprog -someOption dog cat goldfish" 
    //outputs 
    //someOption was set 
    //dog 
    //cat 
    //goldfish 
} 

func usage() { 
    fmt.Printf(usageMsg) 
    flag.PrintDefaults() 
    os.Exit(1) 
}
+1

素敵なコード例 – djhaskin987

0

gofmtgodoc、およびothersは同じ事を処理する方法を参照してください。

+0

:)のために尋ね、彼らが必要なものOPがない与えたので、この答えはダウン投票されたと思います。特定のファイルにリンクするのではなく、それぞれに数千のファイルがあるレポもあります。実際の例はここにあります:https://github.com/golang/go/blob/master/src/crypto/dsa/dsa.go – anon58192932

18

Goのグローバル変数に最も近いのは、パッケージです。

var text string 

コマンドライン引数は、すでにパッケージ変数os.Argsに入っており、それらにアクセスするのを待っています。あなたはフラッグパッケージは必要ありません。

package main 

import (
    "fmt" 
    "os" 
) 

func main() { 
    if len(os.Args) < 2 {  // (program name is os.Arg[0]) 
     fmt.Println("Please give me some text!") 
    } else { 
     fmt.Println(os.Args[1:]) // print all args 
    } 
} 
関連する問題