为什么filepath.Walk()会引发恐慌?

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

Why does filepath.Walk() panic?

问题

我正在尝试为Go编程语言编写维基百科。
我已经将数据放在/data文件夹中,将.html文件放在/tmpl文件夹中。

我已经编写了以下的main函数

func main() {
	walk := func(path string, info os.FileInfo, err error) error {
		if err == nil && !info.IsDir() && filepath.Ext(path) == ".html" {
			http.HandleFunc("/view/", makeHandler(viewHandler))
			http.HandleFunc("/edit/", makeHandler(editHandler))
			http.HandleFunc("/save/", makeHandler(saveHandler))
		}
		return err
	}
	root := TEMPLATE_PATH + "edit.html"
	err := filepath.Walk(root, walk)
	if err != nil {
		return
	}
}

我得到了panic edit.html not found的错误。有人可以指导我吗?

英文:

I am trying to code up the wiki for go programing language.
I have put the data in /data folder and .html files in the /tmpl folder.

I have coded up the main function as follows

func main() {
	walk := func(path string, info os.FileInfo, err error) error {
		if err == nil && !info.IsDir() && filepath.Ext(path) == ".html" {
			http.HandleFunc("/view/", makeHandler(viewHandler))
			http.HandleFunc("/edit/", makeHandler(editHandler))
			http.HandleFunc("/save/", makeHandler(saveHandler))
		}
		return err
	}
	root := TEMPLATE_PATH + "edit.html"
	err := filepath.Walk(root, walk)
	if err != nil {
		return
	}
}

I am getting panic edit.html not found. Could anyone please guide me?

答案1

得分: 1

filepath.Walk的文档中可以看到:

>func Walk(root string, walkFn WalkFunc) error
>
>Walk遍历以root为根的文件树,对树中的每个文件或目录调用walkFn,包括root。通过walkFn过滤访问文件和目录时出现的所有错误。文件按字典顺序遍历,这使得输出是确定性的,但对于非常大的目录,Walk可能效率低下。

所以Walk期望第一个参数是一个目录。你把一个文件放在那里,这导致整个过程抛出一个panic。

我不确定你想要做什么,但如果你想要打开那个文件,可以使用os.Open或者如果你想要测试文件是否存在,可以使用os.Stat

在使用Go编码时的一个通用提示:使用gofmt命令根据样式指南格式化你的代码。

英文:

From the documentation of filepath.Walk you can read:

>func Walk(root string, walkFn WalkFunc) error
>
>Walk walks the file tree rooted at root, calling walkFn for each file or directory in the
>tree, including root. All errors that arise visiting files and directories are filtered by
>walkFn. The files are walked in lexical order, which makes the output deterministic but
>means that for very large directories Walk can be inefficient.

So Walk expects a directory as first parameter. You're putting a file in there, which
makes the whole thing throw a panic.

I'm not sure what you're attempting to do, but if you want to open that file, use os.Open or os.Stat if you want to test for existance.

A general tip when coding in go: Use the gofmt command to format your code according to the style guidelines.

huangapple
  • 本文由 发表于 2012年10月5日 09:03:50
  • 转载请务必保留本文链接:https://go.coder-hub.com/12738149.html
匿名

发表评论

匿名网友

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

确定