突然ですが以下のコードをご覧ください。
動物の種類とその鳴き声の組み合わせがmapになっていて、それを全部出力するコードです。
sample.go
packagemainimport("fmt")funcmain(){sampleMap1:=map[string]string{"犬":"ワンワン","猫":"ニャーン"}sampleMap2:=map[string]string{"犬":"わんわん","猫":"にゃーん"}sampleMaps:=[]map[string]string{sampleMap1,sampleMap2}for_,sampleMap:=rangesampleMaps{fmt.Println(sampleMap)}}
ここでもし、データの一部に出力したくない物が混じっていたとしましょう。
例えばsampleMap2が以下のようになっていたとします。
sample.go
sampleMap2:=map[string]string{"犬":"わんわん","猫":"にゃーん","おじさん":"ぴえん"}
この場合、mapのkeyに"おじさん"があったら、それをdeleteで取り除いてから出力するとします。
sample.go
packagemainimport("fmt")funcmain(){sampleMap1:=map[string]string{"犬":"ワンワン","猫":"ニャーン"}sampleMap2:=map[string]string{"犬":"わんわん","猫":"にゃーん","おじさん":"ぴえん"}sampleMaps:=[]map[string]string{sampleMap1,sampleMap2}for_,sampleMap:=rangesampleMaps{if_,ok:=sampleMap["おじさん"];ok{delete(sampleMap,"おじさん")}fmt.Println(sampleMap)}}
この段階では何のエラーも起きず、出力結果もちゃんと"おじさん": "ぴえん"
が取り除かれたものになります。
pushしたらstaticcheck Failedが出る
しかしこの変更をリモートリポジトリにpushしたところ、staticcheck Failedと言われてしまいました。sample.go:21:3: unnecessary guard around call to delete (S1033)
とのこと。
ローカルでは何のエラーも出なかったのに、どういうことだろう??
というかunnecessary guardってなんぞ?
原因
僕が書いたコードでは「mapのkeyに"おじさん"があったら、それをdeleteで取り除いてから出力」という場合分けをしていましたが、どうやらそこら辺の場合分けはGoが自動でやってくれるらしいです。
つまり、
sample.go
if_,ok:=sampleMap["おじさん"];ok{delete(sampleMap,"おじさん")}
この部分は単にdelete(sampleMap, "おじさん")
で良かったとのこと。
イメージとしては、
ぼく「このkeyを削除してほしいやで」
Gopher君「そんなこと言われても、指定されたkeyがないで……せや! この命令は無視したろ」
的な処理なのでしょうか。細かいことは分かりません。
失礼します。