Go Error:“单值上下文中的多值filepath.Glob()”

时间:2014-07-14 16:51:31

标签: go

有人可以解释为什么这行代码:

var file_list []string = filepath.Glob(os.Getwd() + "/*.*")

产生这些错误:

multiple-value os.Getwd() in single-value context
multiple-value filepath.Glob() in single-value context

谢谢! 布赖恩

1 个答案:

答案 0 :(得分:4)

两者都返回错误,因此您无法直接指定它们。

func Glob(pattern string) (matches []string, err error)
func Getwd() (dir string, err error)

您至少需要忽略错误返回值。

var file_list []string, _ = filepath.Glob(x)

使用:

cwd, _ = os.Getwd()
x := cwd + "/*.*"

但最佳做法是检查错误,如果不是nil则采取行动。

实际上,twotwotwo添加了in the comments

  

不要忽视err,或者有一天你的计划不会做它应该做的事情而你不知道为什么
  很多时候,您希望您的函数也返回错误,并且"默认"你想要的处理程序是

if err != nil { return err }
  

如果错误完全出乎意料,程序可以做的最好的事情就是在遇到它之后退出,然后:

if err != nil { log.Panic("error doing foo: ", err) }. 
  

我建议github.com/kisielk/errcheck来发现错误,即使你是在努力做到一丝不苟,也很容易犯错误。


如果您真的想使用两个返回值中的第一个,而不引入中间变量you would need an helper function

func slice(args ...interface{}) []interface{} {
    return args
}

但由于[]interface不是[]string,因此在您的情况下这不会有多大帮助。


topskip中的the comments提到了另一个帮助函数:

  

也可以使用模式:

oneArg := must(twoArgsFunc(...)) 
  

带有辅助功能' must'否则会引起恐慌,例如text/template/#Must

func Must(t *Template, err error) *Template
  

Must是一个帮助程序,它包含对返回(*Template, error)的函数的调用,并在错误为非零时发生混乱。
  它适用于变量初始化,例如:

var t = template.Must(template.New("name").Parse("text"))