单例的实现依赖 sync.Once 中的 Do 函数,因为每个 sync.Once 类型变量中的 Do 函数永远只会执行一次。

    1. package main
    2. import (
    3. "fmt"
    4. "sync"
    5. "time"
    6. "unsafe"
    7. )
    8. func main() {
    9. for i := 0; i < 10; i++ {
    10. go func() {
    11. user := getUser()
    12. user2 := getUser2()
    13. fmt.Printf("user address: %x\n", unsafe.Pointer(user))
    14. fmt.Printf("user2 address: %x\n", unsafe.Pointer(user2))
    15. }()
    16. }
    17. time.Sleep(time.Millisecond)
    18. }
    19. type User struct {
    20. }
    21. type User2 struct {
    22. }
    23. var (
    24. userInstance *User
    25. user2Instance *User2
    26. userOnce sync.Once
    27. )
    28. func getUser() *User {
    29. userOnce.Do(func() {
    30. userInstance = new(User)
    31. })
    32. return userInstance
    33. }
    34. func getUser2() *User2 {
    35. // 变量userOnce的Do函数只会执行一次,所以user2Instance永远不会被初始化
    36. userOnce.Do(func() {
    37. user2Instance = new(User2)
    38. })
    39. // 永远返回nil
    40. return user2Instance
    41. }

    image.png