我写了一个小片段,以递归走一个目录,返回基于扩展名的文件([]string
)的一个切片。它似乎工作,但我不能完全明白指针后面的想法以及如何正确使用它。试图把握Go的指针
package main
import (
"path/filepath"
"io/ioutil"
"fmt"
)
// aggregator slice should hold the result (a slice of filepaths)
// dir is the current directory being listed
// exts is a slice of extensions that should be included in the result
func recurse(aggregator *[]string, dir string, exts *[]string) []string {
files, _ := ioutil.ReadDir(dir)
for _, file := range files {
// current filepath
path := filepath.Join(dir, file.Name())
// if directory, recursively analyze it
if file.IsDir() {
*aggregator = recurse(aggregator, path, exts)
// else check if file is of proper extension and add it to aggregator
} else {
for _, ext := range *exts {
if (filepath.Ext(path) == ext) {
*aggregator = append(*aggregator, path)
break
}
}
}
}
return *aggregator
}
func getTemplates(templatesDir string, templatesExtensions ...string) {
templates := recurse(&[]string{}, templatesDir, &templatesExtensions)
// for testing purposes just print filepaths
for _, t := range templates {
fmt.Printf("%s\n", t)
}
}
func main() {
getTemplates("./templates", ".tmpl", ".html")
}
的主要问题是使用*aggregator
(aggregator *[]string
),&[]string{}
和*exts
(exts *[]string
)。我来自javascript
世界,其中每个对象基本上都是一个指针,并且您只能显式复制对象和数组。另一方面,在这里,如果我没有使用指针(*aggregator
等),这些对象似乎会在每个函数迭代中被复制。
我是正确的这种方法还是我错过了什么?
明白了,谢谢。因此,举例来说,如果我有一个函数* * *返回值(就像我的例子),指针可能会被省略,但如果我有一个函数*不*返回值,但想修改切片(添加/删除项目),我必须使用指针。 –