Skip to content

Instantly share code, notes, and snippets.

@devries
Last active October 29, 2018 15:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save devries/4b05f104e2e69a9ac26a1ad2e6b0193e to your computer and use it in GitHub Desktop.
Save devries/4b05f104e2e69a9ac26a1ad2e6b0193e to your computer and use it in GitHub Desktop.
Singleton Example for Go
package main
import (
"fmt"
"sync"
"time"
)
func main() {
go setter()
s := Singleton()
for i := 0; i < 30; i++ {
v := s.Get()
fmt.Printf("%d: %d\n", i, v)
time.Sleep(time.Duration(1) * time.Second)
}
}
func setter() {
s := Singleton()
for i := 0; i < 10; i++ {
s.Set(i)
time.Sleep(time.Duration(2) * time.Second)
}
}
type singleton struct {
i int
mu sync.RWMutex
}
var (
globalS *singleton
once sync.Once
)
func (s *singleton) Get() int {
s.mu.RLock()
defer s.mu.RUnlock()
return s.i
}
func (s *singleton) Set(v int) {
s.mu.Lock()
defer s.mu.Unlock()
s.i = v
}
func Singleton() *singleton {
once.Do(func() {
globalS = &singleton{}
})
return globalS
}
@devries
Copy link
Author

devries commented Oct 29, 2018

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment