单例模式

单例模式是最简单的设计模式之一,它提供了创建对象的最佳方式。这种模式涉及到一个单一的结构体,该结构体负责创建自己的对象,同时确保只有单个对象被创建。即多次创建一个结构体的对象,得到的对象的存储地址永远与第一次创建对象的存储地址相同。

实现原理

利用 sync.Once 方法Do,确保Do中的方法只被执行一次的特性,创建单个结构体实例。

实现

  1. import (
  2. "sync"
  3. )
  4. var (
  5. instance *School
  6. once sync.Once
  7. )
  8. type School struct {
  9. Name string
  10. Tel string
  11. }
  12. func CreateSchool(name, tel string) *School {
  13. once.Do(func() {
  14. instance = new(School)
  15. instance.Name = name
  16. instance.Tel = tel
  17. })
  18. return instance
  19. }

使用Do方法也巧妙的保证了并发线程安全。

测试

  1. package main
  2. import (
  3. "fmt"
  4. "strconv"
  5. "sync"
  6. )
  7. var (
  8. instance *School
  9. once sync.Once
  10. )
  11. type School struct {
  12. Name string
  13. Tel string
  14. }
  15. func CreateSchool(name, tel string) *School {
  16. once.Do(func() {
  17. fmt.Println("----- init -----")
  18. instance = new(School)
  19. instance.Name = name
  20. instance.Tel = tel
  21. })
  22. return instance
  23. }
  24. func main() {
  25. var wg sync.WaitGroup
  26. wg.Add(10)
  27. for i:=0; i<10; i++ {
  28. go func(seq int) {
  29. defer wg.Done()
  30. seqStr := strconv.Itoa(seq)
  31. school := CreateSchool("school"+seqStr, seqStr)
  32. fmt.Printf(
  33. "%s\tname: %s,\t tel: %s,address:%p\n",
  34. seqStr,
  35. school.Name,
  36. school.Tel,
  37. school,
  38. )
  39. } (i)
  40. }
  41. wg.Wait()
  42. }

执行结果:

  1. 1. ----- init -----
  2. 2. 9 name: school9, tel: 9address:0xc0000b0000
  3. 3. 2 name: school9, tel: 9address:0xc0000b0000
  4. 4. 5 name: school9, tel: 9address:0xc0000b0000
  5. 5. 3 name: school9, tel: 9address:0xc0000b0000
  6. 6. 4 name: school9, tel: 9address:0xc0000b0000
  7. 7. 6 name: school9, tel: 9address:0xc0000b0000
  8. 8. 0 name: school9, tel: 9address:0xc0000b0000
  9. 9. 8 name: school9, tel: 9address:0xc0000b0000
  10. 10. 7 name: school9, tel: 9address:0xc0000b0000
  11. 11. 1 name: school9, tel: 9address:0xc0000b0000

可以看出,所有实例化的对象都有相同的内容,且指向的地址相同。

https://blog.csdn.net/tcattime/article/details/106882600