msty開発メモ

技術ネタを綴ります

【Go】mapからキーを削除する方法

参考書どおりに書いたら動かなかったのでメモ

f:id:mstybird:20160521171905p:plain

この問題に詰まってここに来た人はこんな感じのコードを書いたんじゃないでしょうか

package main
import "fmt"
func main(){
    m:=make(map[string]int)
    m["id"]=100
    fmt.Printf("%v\n",m)
    //idを消す
    m["id"]=0,false //しかしコンパイルエラー
}    

調べてみたところこのような記事がありました
stackoverflow.com


要約すると、あの書き方は昔のgo言語で使える方法だったけど、今は使えないよ!別の方法を使ってね!ということです。

答えは以下の書き方です

delete(m,"id")

従来の書き方では必ずfalseを渡していたほか、新しく値を代入したところでそのキーは無効化されているため、謎が多い書き方だったみたいです。
delete関数は戻り値を持たないのでキーの削除が成功したかどうかの結果はわかりませんが、
削除後、そのキーが存在するか調べれば消せたかわかります

package main
import "fmt"
func main(){
    m:=make(map[string]int)
    m["id"]=100
    fmt.Printf("%v\n",m)
    _,ok:=m["id"]
    //idキーが存在することを確認
    fmt.Printf("%v\n",ok)
    //idキーを削除
    delete(m,"id")
    //idキーが存在するか確認
    _,ok=m["id"]
    //存在しないので結果はfalse
    fmt.Printf("%v\n",ok)

}    
map[id:100]
true
false

もっと英語頑張らないとね。
Google翻訳を手放せるようになりたい