
タイトルの通りなのですが
ある時、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)
}
おわり!!