エンジニアはこわくない

自分の好きな音楽とか雑記とかエンジニアっぽい内容を好きなように書く場所。

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)
}

おわり!!