LoginSignup
2
0

More than 3 years have passed since last update.

"unnecessary guard around call to delete" という不思議なエラーが出た話

Posted at

突然ですが以下のコードをご覧ください。
動物の種類とその鳴き声の組み合わせがmapになっていて、それを全部出力するコードです。

sample.go
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が以下のようになっていたとします。

sample.go
sampleMap2 := map[string]string{
    "犬":     "わんわん",
    "猫":     "にゃーん",
    "おじさん": "ぴえん"}

この場合、mapのkeyに"おじさん"があったら、それをdeleteで取り除いてから出力するとします。

sample.go
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が自動でやってくれるらしいです。

つまり、

sample.go
if _, ok := sampleMap["おじさん"]; ok {
    delete(sampleMap, "おじさん")
}

この部分は単にdelete(sampleMap, "おじさん")で良かったとのこと。
イメージとしては、

ぼく「このkeyを削除してほしいやで」
Gopher君「そんなこと言われても、指定されたkeyがないで……せや! この命令は無視したろ」

的な処理なのでしょうか。細かいことは分かりません。

失礼します。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0