Глобальные переменные / Получить аргумент командной строки и распечатать его - PullRequest
7 голосов
/ 03 марта 2012

Это может звучать глупо, но как мне определить глобальную переменную в 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 ... ... Я знаю, что это нубский вопрос, поэтому я надеюсь, что вы мне поможете ...

Ответы [ 4 ]

30 голосов
/ 03 марта 2012

Я вижу здесь как минимум два вопроса, может быть, три.

  1. Как вы объявляете глобальную переменную?
  2. Как вы объявляете глобальную константу?
  3. Как вы анализируете параметры командной строки и аргументы?

Я надеюсь, что приведенный ниже код демонстрирует это полезным способом. Пакет с флагами был одним из первых, на котором мне приходилось резать зубы в Go. В то время это было неочевидно, хотя документация улучшается.

К вашему сведению, на момент написания этой статьи я использовал 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)
}
20 голосов
/ 04 марта 2012

Ближайшей вещью к глобальной переменной в Go является переменная package . Вы определяете один как

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
    }
}
0 голосов
/ 03 марта 2012

Посмотрите, как gofmt, godoc и другие обрабатывают одно и то же.

0 голосов
/ 03 марта 2012

Зачем вам нужна глобальная переменная? Например,

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...