J'ai écrit un petit snippet pour parcourir récursivement un répertoire et retourner une tranche de fichiers ( []string
) en fonction de l'extension. Cela semble fonctionner, mais je n'arrive pas à saisir pleinement l'idée derrière les pointeurs et comment l'utiliser correctement.
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")
}
La question principale est d'utiliser *aggregator
( aggregator *[]string
), &[]string{}
y *exts
( exts *[]string
). Je viens de javascript
Un monde où chaque objet est fondamentalement un pointeur et où vous ne pouvez copier des objets et des tableaux que de manière explicite. Ici, d'un autre côté, il semble que si je n'utilisais pas de pointeurs ( *aggregator
etc.), ces objets seraient copiés à chaque itération de la fonction.
Est-ce que cette approche est correcte ou est-ce que je rate quelque chose ?