2012-03-02 6 views
6

Może to zabrzmieć głupio, ale jak zdefiniować zmienną globalną w Go? const myglobalvariable = "Hi there!" tak naprawdę nie działa ...Zmienne globalne/Uzyskaj argument wiersza polecenia i wydrukuj go

Po prostu chcę uzyskać argument wiersza poleceń, a po tym chcę go wydrukować. Robię to za pomocą tego fragmentu kodu:

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!") 
    } 
} 

Problemem jest to, że po prostu drukuje pustą linię więc pomyślałem o deklarując zmienną globalną używając const myglobalvariable = "Hi there!" ale ja po prostu błąd cannot use flag.Args() (type []string) as type ideal string in assignment ... ... ja wiem, że to jest pytanie typu noob, więc mam nadzieję, że możesz mi pomóc ...

Odpowiedz

-5

Dlaczego potrzebna jest zmienna globalna? Na przykład:

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

ta odpowiedź była dół głosowało ponieważ dał OP, co potrzebne, a nie to, czego hasła :) –

25

Widzę tutaj co najmniej dwa pytania, może trzy.

  1. Jak zadeklarować zmienną globalną?
  2. Jak deklarujesz stałą globalną?
  3. Jak analizować opcje wiersza poleceń i argumenty?

Mam nadzieję, że poniższy kod demonstruje to w przydatny sposób. Pakiet flag był jednym z pierwszych pakietów, w których musiałem przeciąć moje zęby w Go. W tym czasie nie było to oczywiste, chociaż dokumentacja się poprawia.

FYI, w chwili pisania tego artykułu używam jako odnośnika http://weekly.golang.org. Strona główna jest zbyt przestarzała.

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

przykład ładny kod – djhaskin987

0

Zobacz jak gofmt, godoc i others obsłużyć to samo.

+0

To jest naprawdę leniwy odpowiedź. Nie masz nawet powiązania z konkretnym plikiem, a raczej z repozytorium zawierającym tysiące plików. Przykłady z rzeczywistego świata są tutaj: https://github.com/golang/go/blob/master/src/crypto/dsa/dsa.go – anon58192932

18

Najbliższą rzeczą dla zmiennej globalnej w Go jest zmienna o numerze. Zdefiniować jeden jak

var text string 

argumenty wiersza poleceń, choć są już siedzi w zmiennej pakiet, os.Args, czeka na nich dostęp. Nie potrzebujesz nawet pakietu flag. Myślę

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 
    } 
}