golangのmutexはポインタで渡すようにしよう
タイトルの通りなのですが
ある時、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) }
おわり!!