某些时候我们会有让函数只能被调用一次的需求
- 完成这个功能可以使用
Go
的 sync.Once
方法
package main
import (
"fmt"
"sync"
)
type SayHello struct {
once sync.Once
}
func (sayHello *SayHello) print() {
sayHello.once.Do(func() {
fmt.Println("hello")
})
}
func main() {
var a SayHello
a.print()
a.print()
a.print()
a.print()
a.print()
a.print()
}
输出:
hello
- 当然也可以自己使用
锁
和 标志位 flag
或 count
计数器完成这个功能
package main
import (
"fmt"
"sync"
)
type SayHello struct {
mutex sync.Mutex
isUsed bool
}
func (once *SayHello) Print() {
once.mutex.Lock()
if !once.isUsed {
fmt.Println("hello")
once.isUsed = true
}
once.mutex.Unlock()
}
func main() {
a := SayHello{}
a.Print()
a.Print()
a.Print()
a.Print()
a.Print()
a.Print()
}
输出:
hello