Golang : How to run your code only once with sync.Once object
Problem :
You have a function that will load a resource such as reading configuration data from an external file as part of the initialization process. However, each time when the main program calls the function, it will read the configuration data again and again.
How to ensure that certain part of the function only execute once only? Load once instead of reading the configuration data again and again?
Solution :
Use the sync.Once
object. Below is an example that demonstrates how sync.Once
object can be used to wrap some part of the code inside a function to only execute once.
package main
import (
"fmt"
"strings"
"sync"
)
var configurationFile = "configuration_data = x"
var onlyOnce sync.Once
var config strings.Reader
func main() {
getData()
go getData()
go getData()
getData()
// keep running until user press Control-C
for {
}
}
//---------------------------------------------------------------------------------------
func getData() {
// we only want to load the configuration once
onlyOnce.Do(func() {
fmt.Println("Load run-time configuration first and the only time. ")
config = *strings.NewReader(configurationFile)
})
fmt.Println(config)
}
Output:
2019/06/18 10:00:00 Load run-time configuration first and the only time.
2019/06/18 10:00:00 {configuration_data = x 0 -1}
2019/06/18 10:00:00 {configuration_data = x 0 -1}
2019/06/18 10:00:00 {configuration_data = x 0 -1}
2019/06/18 10:00:00 {configuration_data = x 0 -1}
Happy coding!
References :
https://golang.org/pkg/sync/#Once
https://www.socketloop.com/references/golang-strings-newreader-function-example
See also : Golang : A program that contain another program and executes it during run-time
By Adam Ng(黃武俊)
IF you gain some knowledge or the information here solved your programming problem. Please consider donating to the less fortunate or some charities that you like. Apart from donation, planting trees, volunteering or reducing your carbon footprint will be great too.
Advertisement
Tutorials
+5.3k Golang : What is StructTag and how to get StructTag's value?
+31k Golang : Calculate percentage change of two values
+15.8k Golang : Get current time from the Internet time server(ntp) example
+16k Golang : Get sub string example
+5.2k PHP : See installed compiled-in-modules
+33.5k Golang : How to check if slice or array is empty?
+17.9k Golang : Get all upper case or lower case characters from string example
+6k Fix ERROR 2003 (HY000): Can't connect to MySQL server on 'IP address' (111)
+26.5k Golang : Encrypt and decrypt data with AES crypto
+5.2k Python : Convert(cast) string to bytes example
+9.5k Golang : Validate IPv6 example
+7.8k Golang : Trim everything onward after a word