Go语言提供了一个sync包中的Once类型,它可以用来保证某个函数只被执行一次。Once类型包含一个Do方法,该方法接受一个函数作为参数,它保证该函数只会被执行一次,并且多个goroutine并发调用Do方法时,只有一个goroutine能够成功执行该函数。
以下是一个示例代码:
package main
import (
"fmt"
"sync"
)
func setup() {
fmt.Println("Setting up...")
}
func main() {
var once sync.Once
for i := 0; i < 5; i {
go func() {
once.Do(setup)
fmt.Println("Running...")
}()
}
fmt.Scanln()
}
在上面的代码中,我们创建了一个sync.Once类型的变量once,然后在一个for循环中启动了5个goroutine,它们会同时调用Do方法并传递setup函数作为参数。由于我们在setup函数中输出了"Setting up...",因此只有一个goroutine能够成功执行该函数。在这个例子中,我们还在每个goroutine中输出了"Running...",以证明setup函数只被执行了一次。
输出结果如下:
Setting up...
Running...
Running...
Running...
Running...
Running...
另外:fmt.Scanln() 是一个函数,它可以从标准输入读取一行文本并将其存储在指定的变量中。它会一直等待,直到用户输入一行文本并按下回车键。
总结
以上是Go语言实现只运行一次的方法,其中利用了sync包中的Once类型来保证某个函数只被执行一次。Once类型可以在多个goroutine之间共享,它的实现使用了互斥锁和原子操作,可以保证并发安全性。在实际开发中,我们应该注意避免使用全局变量或单例模式,以便更好地利用Go语言的并发机制和特性。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved