import (
"fmt"
+ "os"
"sync"
)
// Output:
// Only once
}
+
+// This example uses OnceValue to perform an "expensive" computation just once,
+// even when used concurrently.
+func ExampleOnceValue() {
+ once := sync.OnceValue(func() int {
+ sum := 0
+ for i := 0; i < 1000; i++ {
+ sum += i
+ }
+ fmt.Println("Computed once:", sum)
+ return sum
+ })
+ done := make(chan bool)
+ for i := 0; i < 10; i++ {
+ go func() {
+ const want = 499500
+ got := once()
+ if got != want {
+ fmt.Println("want", want, "got", got)
+ }
+ done <- true
+ }()
+ }
+ for i := 0; i < 10; i++ {
+ <-done
+ }
+ // Output:
+ // Computed once: 499500
+}
+
+// This example uses OnceValues to read a file just once.
+func ExampleOnceValues() {
+ once := sync.OnceValues(func() ([]byte, error) {
+ fmt.Println("Reading file once")
+ return os.ReadFile("example_test.go")
+ })
+ done := make(chan bool)
+ for i := 0; i < 10; i++ {
+ go func() {
+ data, err := once()
+ if err != nil {
+ fmt.Println("error:", err)
+ }
+ _ = data // Ignore the data for this example
+ done <- true
+ }()
+ }
+ for i := 0; i < 10; i++ {
+ <-done
+ }
+ // Output:
+ // Reading file once
+}