How to correctly use os.Args in golang?

huangapple go评论87阅读模式
英文:

How to correctly use os.Args in golang?

问题

你可以使用os.Args来获取命令行参数。os.Args是一个字符串切片,其中第一个元素是程序的名称,后面的元素是传递给程序的参数。

在你的代码中,你可以这样使用os.Args

if len(os.Args) > 1 {
    configpath := os.Args[1]
    fmt.Println("1") // For debug
} else {
    configpath := "/etc/buildozer/config"
    fmt.Println("2")
}

configuration := config.ConfigParser(configpath)

然而,你在代码中定义configpath的方式是不正确的。在ifelse语句块中,你应该使用赋值操作符=而不是声明操作符:=。这样才能在整个函数中访问到configpath变量。

修正后的代码如下:

var configpath string

if len(os.Args) > 1 {
    configpath = os.Args[1]
    fmt.Println("1") // For debug
} else {
    configpath = "/etc/buildozer/config"
    fmt.Println("2")
}

configuration := config.ConfigParser(configpath)

这样,你就可以正确地使用os.Args获取命令行参数,并将其作为配置文件的路径传递给config.ConfigParser函数。

英文:

I need to use config in my go code and I want to load config path from command-line.
I try:

if len(os.Args) > 1 { 
		configpath := os.Args[1]
		fmt.Println("1") // For debug
	} else {
		configpath := "/etc/buildozer/config"
		fmt.Println("2")
	}

Then I use config:

configuration := config.ConfigParser(configpath)

When I launch my go file with parameter (or without) I receive similar error

# command-line-arguments
src/2rl/buildozer/buildozer.go:21: undefined: configpath

How should I correctly use os.Args?

答案1

得分: 21

在你的if语句之外定义configPath

configPath := ""
    
if len(os.Args) > 1 { 
  configPath = os.Args[1] 
  fmt.Println("1") // 用于调试目的 
} else { 
  configPath = "/etc/buildozer/config"
  fmt.Println("2") 
}

注意,在if语句内部使用configPath =(而不是:=)。

这样,configPathif语句之前就被定义了,并且在if语句之后仍然可见。

更多信息请参见"声明和作用域"和"变量声明"。

英文:

Define configPath outside the scope of your if.

configPath := ""

if len(os.Args) > 1 { 
  configPath = os.Args[1] 
  fmt.Println("1") // For debugging purposes 
} else { 
  configPath = "/etc/buildozer/config"
  fmt.Println("2") 
}

Note the 'configPath =' (instead of :=) inside the if.

That way configPath is defined before and is still visible after the if.

See more at "Declarations and scope" / "Variable declarations".

答案2

得分: 2

另一种方法是将逻辑封装在一个函数中:

package main
import "os"

func configPath(a []string) string {
   switch len(a) {
      case 1: return "/etc/buildozer/config"
      default: return os.Args[1]
   }
}

func main() {
   config := configPath(os.Args)
   println(config)
}

这样可以避免作用域问题。

英文:

For another approach, you can wrap the logic in a function:

package main
import "os"

func configPath(a []string) string {
   switch len(a) {
      case 1: return "/etc/buildozer/config"
      default: return os.Args[1]
   }
}

func main() {
   config := configPath(os.Args)
   println(config)
}

this avoids the scoping issue.

huangapple
  • 本文由 发表于 2014年4月21日 16:21:33
  • 转载请务必保留本文链接:https://go.coder-hub.com/23193610.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定