aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAustin Clements <austin@google.com>2023-03-28 14:53:57 -0400
committerGopher Robot <gobot@golang.org>2024-04-23 17:45:47 +0000
commit960fa9bf66139e535d89934f56ae20a0e679e203 (patch)
treea871b6e4da8c910d9ffbad43fc5c2651222583d3
parenta62c290c5056d838c1a3c8f3a6375b5bc51c7666 (diff)
downloadgo-960fa9bf66139e535d89934f56ae20a0e679e203.tar.gz
go-960fa9bf66139e535d89934f56ae20a0e679e203.zip
sync: add examples for OnceValue and OnceValues
Updates #56102. Change-Id: I2ee2dbc43b4333511d9d23752fdc574dfbf5f5bd Reviewed-on: https://go-review.googlesource.com/c/go/+/481062 Reviewed-by: Andrew Gerrand <adg@golang.org> Auto-Submit: Austin Clements <austin@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Joedian Reid <joedian@google.com>
-rw-r--r--src/sync/example_test.go54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/sync/example_test.go b/src/sync/example_test.go
index f009a68cf2..ed240e57ae 100644
--- a/src/sync/example_test.go
+++ b/src/sync/example_test.go
@@ -6,6 +6,7 @@ package sync_test
import (
"fmt"
+ "os"
"sync"
)
@@ -57,3 +58,56 @@ func ExampleOnce() {
// 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
+}