エンジニアはこわくない

好きなように書く

golangのmutexはポインタで渡すようにしよう


スポンサーリンク

f:id:tsujitaku50:20170224131252j:plain

タイトルの通りなのですが

ある時、golangを書いていてvetコマンドを実行したときに警告が表示されました。

その警告を見て「へーそうなんだ」と思ったので今回はそれについて少し書きたいと思います。

表示される警告

その警告ですが下記のような文言が表示されます。

passes Lock by value: sync.Mutex

これについて調べたんですが警告が表示される原因が

「mutexを値渡しで渡しているから」です。

手っ取り早く警告をなくしたい場合、mutexをポインタ渡しで渡せばオッケーです!

なぜmutexを値渡しで渡すと警告が出るのか。

それは

「値コピーしてしまうとロックしている状態のまま別のmutexインスタンスになってしまうから」

です。

golangではmutexインスタンスは常にポインタ渡しで渡すようにしておきましょう。

実例

簡単な例ですがmutexを使用した場合に

vetコマンドで警告が表示されるコードを書きました。
(コードの意味自体は特にありません笑。あくまで警告が表示されるためだけにパッと書いたので笑)

  • 警告が表示される例(mutexを値渡しで渡している)
package main

import (
    "fmt"
    "sync"
)

func add(number int, mutex sync.Mutex) int {
    mutex.Lock()
    mutex.Unlock()
    return number + 1
}

func main() {
    var mutex sync.Mutex

    result := add(1, mutex)
    fmt.Println("result=", result)
}



  • 良い例(mutexをポインタ渡しで渡している)
package main

import (
    "fmt"
    "sync"
)

func add(number int, mutex *sync.Mutex) int {
    mutex.Lock()
    mutex.Unlock()
    return number + 1
}

func main() {
    var mutex sync.Mutex

    result := add(1, &mutex)
    fmt.Println("result=", result)
}

おわり!!