2017-01-25 3 views
1
package main 

import (
    "fmt" 
) 

var store = map[string]int{} 

func breadArrived(num int) { 
    if breadTotal, ok := store["bread"]; ok { 
     breadTotal += num 
    } else { 
     store["bread"] = num 
    } 
    fmt.Printf("%v\n", store) 
} 

func main() { 
    breadArrived(1) 
    breadArrived(2) 
    breadArrived(3) 
} 

上記のコードでは、+=演算子は無視されるため、store["bread"]は常に1になります。私はここで "参照渡し"のようなものがないと思います。また、これを行うもっと便利な方法がありますか?Golang:マップ内の値を設定し、順次インクリメントする実際的な方法は?

ありがとうございました。

答えて

3

breadTotalローカル変数のみをインクリメントしていますが、storeマップの値ではありません。それは次のようになります。

store["bread"] = breadTotal + num 

また、あなたは、単に行うことができます。

store["bread"] += num 

また、マップのインデックスを作成すると、intためのマップではまだありませんキーの値の種類(ゼロ値のzero valueを返しますので、 0 - まだパンがないと言っています)、ifはまったく必要ありません。あなたが簡単に行うことができます。

func breadArrived(num int) { 
    store["bread"] += num 
    fmt.Printf("%v\n", store) 
} 

出力(Go Playground上でそれを試してみてください):

map[bread:1] 
map[bread:3] 
map[bread:6] 
2

breadTotal変数はmap整数値のコピーだけで、あなたは増分するstore["bread"] += numとしてそれを参照する必要がmap整数値です。ところで

https://play.golang.org/p/LQzrbSZudH

package main 

import (
    "fmt" 
) 

var store = map[string]int{} 

func breadArrived(num int) { 
    store["bread"] += num 
    fmt.Printf("%v\n", store) 
} 

func main() { 
    breadArrived(1) 
    breadArrived(2) 
    breadArrived(3) 
} 

Goは、デフォルト値が0ある整数の場合には、デフォルト値にすべてを初期化しているため、map整数の最初のインクリメントが動作します。

関連する問題