突然ですが以下のコードをご覧ください。
動物の種類とその鳴き声の組み合わせがmapになっていて、それを全部出力するコードです。
package main
import (
"fmt"
)
func main() {
sampleMap1 := map[string]string{
"犬": "ワンワン",
"猫": "ニャーン"}
sampleMap2 := map[string]string{
"犬": "わんわん",
"猫": "にゃーん"}
sampleMaps := []map[string]string{sampleMap1, sampleMap2}
for _, sampleMap := range sampleMaps {
fmt.Println(sampleMap)
}
}
ここでもし、データの一部に出力したくない物が混じっていたとしましょう。
例えばsampleMap2が以下のようになっていたとします。
sampleMap2 := map[string]string{
"犬": "わんわん",
"猫": "にゃーん",
"おじさん": "ぴえん"}
この場合、mapのkeyに"おじさん"があったら、それをdeleteで取り除いてから出力するとします。
package main
import (
"fmt"
)
func main() {
sampleMap1 := map[string]string{
"犬": "ワンワン",
"猫": "ニャーン"}
sampleMap2 := map[string]string{
"犬": "わんわん",
"猫": "にゃーん",
"おじさん": "ぴえん"}
sampleMaps := []map[string]string{sampleMap1, sampleMap2}
for _, sampleMap := range sampleMaps {
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が自動でやってくれるらしいです。
つまり、
if _, ok := sampleMap["おじさん"]; ok {
delete(sampleMap, "おじさん")
}
この部分は単にdelete(sampleMap, "おじさん")
で良かったとのこと。
イメージとしては、
ぼく「このkeyを削除してほしいやで」
Gopher君「そんなこと言われても、指定されたkeyがないで……せや! この命令は無視したろ」
的な処理なのでしょうか。細かいことは分かりません。
失礼します。