越努力 越幸运

如何在 Go 语言中实现单例模式

有关单例模式的相关内容可以参考《设计模式之单例模式》

单例模式的核心在于保证系统中一个类只有一个实例且该实例易于外界访问

1. 非线程安全 Lazy 方式

非线程安全的单例模式是最常见的实现方式,但是它不能在多线程情况下使用,在 Go 中实现如:

type Singleton struct {
    // something
}

var instance *Singleton

func GetInstance() *Singleton {
    if instance == nil {
        instance = &Singleton{}
    }
    
    return instance
}

这种写法对应着 CPP 中的实现方式。

Go 语言 net 包使用记录

1. 基础概念

关于网络IPC(套接字)相关的知识点,可以参考相关《学习笔记》

在 Go 语言中,包 net 封装了关于网络套接字的所有接口。

对于服务端,使用 Listen 进行监听,使用 Accept 响应连接请求;

对于客户端,使用 Dial 进行服务连接请求,使用包 fmt 里的函数 Fprint 可以进行数据发送。

网络IPC(套接字)学习笔记

1. socket 描述符

socket 主要用于运行在不同服务器上的进程之间通信,也可以用于在同一服务器上的进程之间通信。

socket 描述符则是 socket 的唯一标识,其本质是一种特殊的文件描述符

创建 socket 描述符的函数原型为:

int socket(int domain, int type, int protocol);

参数说明:

  • domain 参数决定了通信的性质,即地址格式等
    • AF_INET: IPv4因特网域
    • AF_INET6: IPv6因特网域
    • AF_UNIX: UNIX域
    • AF_UNSPEC: 未指定,可以表达任何域的通配符
  • type 参数指定类型
    • SOCK_DGRAM: 固定长度,无连接,不可靠的消息
    • SOCK_RAW: IP协议的数据报接口
    • SOCK_SEQPACKET: 固定长度,顺序式,面向连接的,可靠的消息
    • SOCK_STREAM:顺序式,面向连接的,双向的,可靠的字节流
  • protocol 参数代表协议号
    • 0: 使用对于给定 domain 和 type 下的默认协议,在 AF_INET 通信域下, SOCK_STREAM 类型的默认协议是 TCP协议,而对于 SOCK_DGRAM 类型的默认协议则是 UDP协议
Go 语言 sync 包使用记录

在 Go 语言中 sync 包提供了互斥锁、读写锁等基本同步原语,除了 OnceWaitGroup 类型外,其他类型基本都是为底层函数库而准备,上层次的同步最好还是通过 channel 来完成。

更多更全的信息和使用说明请见官网文档

设计模式之单例模式

1. 目的

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

2. 动机

如何才能保证一个类只有一个实例,并且这个实例易于被访问?

一个全局变量使得一个对象可以被访问,但它不能防止实例化多个对象。

更好的办法是:让类自身负责保存它的唯一实例。

这个类可以保证没有其它实例可以被创建,并且它可以提供一个访问该实例的方法,这就是单例(Singleton)模式。