下面的代码打开一个 .txt 文件并计算词频。我正在关注一本书,但我感到困惑:我的问题在这里:filename := os.Args[1]frequencyForWord := map[string]int{}updateFrequencies(filename, frequencyForWord)fmt.Println(frequencyForWord)我创建了一个名为的变量frequencyForWord并将其传递给一个不返回任何调用的函数func updateFrequencies这个函数修改了变量,这就是为什么当我这样做时,fmt.Println(frequencyForWord)它向我展示了一个以单词作为键和它们的计数作为值的映射。我的问题是:为什么我不必做这样的事情frequencyForWord = updateFrequencies(filename, frequencyForWord)fmt.Println(frequencyForWord)// And then change func updateFrequencies to something to returns a map我想为了让函数修改变量,我需要像这样传入变量作为引用 updateFrequencies(filename, &frequencyForWord)原始代码:package mainimport("fmt""path/filepath""os""log""bufio""strings""unicode")func main() { if len(os.Args) == 1 || os.Args[1] == "-h" { fmt.Printf("usage: %s <file>\n", filepath.Base(os.Args[0])) os.Exit(1) } filename := os.Args[1] frequencyForWord := map[string]int{} updateFrequencies(filename, frequencyForWord) fmt.Println(frequencyForWord)}func updateFrequencies(filename string, frequencyForWord map[string]int) string { file, err := os.Open(filename) if err != nil { log.Printf("Failed to open the file: %s.", filename) } defer file.Close() readAndUpdateFrequencies(bufio.NewScanner(file), frequencyForWord)}func readAndUpdateFrequencies(scanner *bufio.Scanner, frequencyForWord map[string]int) { for scanner.Scan() { for _, word := range SplitOnNonLetter(strings.TrimSpace(scanner.Text())) { frequencyForWord[strings.ToLower(word)] += 1 } } if err := scanner.Err(); err != nil { log.Fatal(err) }}func SplitOnNonLetter(line string) []string { nonLetter := func(char rune) bool { return !unicode.IsLetter(char) } return strings.FieldsFunc(line, nonLetter)}
2 回答
侃侃尔雅
TA贡献1801条经验 获得超16个赞
因为地图结构本身不包含值,而是指向保存值的结构。
正如文档中所写:
像切片一样,映射保存对底层数据结构的引用。如果您将地图传递给更改地图内容的函数,则更改将在调用方中可见。
这就像你传递一个指向函数的指针一样:它让函数改变你的值。
这是相同现象的另一个例子:
type A struct {
b *B
}
type B struct {
c int
}
func incr(a A) {
a.b.c++
}
func main() {
a := A{}
a.b = new(B)
fmt.Println(a.b.c) // prints 0
incr(a)
fmt.Println(a.b.c) // prints 1
}
- 2 回答
- 0 关注
- 265 浏览
添加回答
举报
0/150
提交
取消