下面的代碼打開一個 .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 關注
- 306 瀏覽
添加回答
舉報
0/150
提交
取消
