亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

golang中的變量修改【可變性】

golang中的變量修改【可變性】

Go
陪伴而非守候 2021-06-06 02:00:17
下面的代碼打開一個 .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

}


查看完整回答
反對 回復 2021-06-28
  • 2 回答
  • 0 關注
  • 306 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號