gpt4 book ai didi

pointers - 试图掌握围棋的指针

转载 作者:IT王子 更新时间:2023-10-29 01:41:41 24 4
gpt4 key购买 nike

我写了一个小片段来递归地遍历一个目录并返回一个基于扩展名的文件片段 ([]string)。它似乎有效,但我无法完全理解指针背后的想法以及如何正确使用它。

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 等),这些对象似乎会在每次函数迭代时被复制。

我的这种方法是否正确,还是遗漏了什么?

最佳答案

虽然此可视化不是专门针对 Go(它是关于 Java),但它是实际可视化指针和值的使用的完美可视化 (1): enter image description here

如您所见,指针实际上不包含任何数据,但它指向数据所在的位置。因此,通过指针对该数据所做的任何修改实际上都是在数据本身上执行的。但是数据不一定驻留在我们的指针被使用的地方。

在不同的情况下我们可能需要指针。例如,当你想在一个特定的地方修改实际值(而不是传递这些值)或者当你的数据太大以至于发送实际内容的成本太高时。你可以使用一个/一些指向这个大数据的指针,并且每个人(例如每个函数)都有一个指向该数据的指针,可以读取它或修改它。正如我们所说,我们可以根据需要拥有尽可能多的指向相同数据的指针。所以可能有很多指向同一个数据的指针。这些指针的值可是相同的;这是源数据(对象)的地址。

(1) Source

关于pointers - 试图掌握围棋的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42594475/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com