28814


makeによってデータ構造の参照を作り、関数に参照を渡しデータの変更を行います。  
以下のような出力になるのはなぜでしょうか？

<https://play.golang.org/p/lOC49HmVcq>

[code]

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        a := make(map[string]int)
        set(a)
        fmt.Println(a)
    }
    
    func set(a map[string]int){
      for i:=0; i<10; i++ {
        a["key"]++
      }
      a = map[string]int{"key":1}
      fmt.Println(a)
    }
    
[/code]

出力  
map[key:1]  
map[key:10]

参照の値変更は最終的に`a = map[string]int{"key":1}`が適用されて、予想した出力は  
map[key:1]  
map[key:1]

だったのですが、、ロジックを教えてください。


CC BY-SA 3.0
2016-09-11T01:56:13.827
28812
2016-09-11T02:45:46.317
8558
question
アルゴリズム go
makeによってつくられたデータ構造の参照渡し


mainとsetそれぞれに`println(&a)`という行を追加して、aのポインタを見ると別のアドレスになっていることが分かると思います。  
すなわちset関数の引数を`a *map[string]int`にして、ポインタを渡すようにすると期待通りに動作します。  
setの引数をポインタにした後にset内でのaのアドレスを確認する場合は、`println(a)`とすることに注意してください。


CC BY-SA 3.0
2016-09-11T02:45:46.317
28814
2016-09-11T02:45:46.317
18748
28812
answer