싱글톤은 특정 클래스에 대해서 객체 인스터스가 하나만 만들어 질 수 있도록 해주는 패턴이다. 이 패턴을 사용하면 전역 변수를 사용할 때와 맟나가지로 객체 인스턴스를 어디서든지 액세스 할 수 있다.

package singleton

type singleton struct {
	count int
}

var instance *singleton

func GetInstance() *singleton {
	if instance == nil {
		instance = new(singleton)
	}
	return instance
} //인스턴스를 만들거나 있으면 해당 인스턴스를 리턴

func (s *singleton) AddOne() int {
	s.count++
	return s.count
}

미리 인스턴스를 생성하지 않고, 존재하지 않았을때서야 인스턴스를 생성하는 방식을 게으른 인스턴스 생성이라고 부른다. 싱글톤은 커넥션 풀 또는 쓰레드 풀등 여러곳에서 자주 쓰인다.

싱글톤 패턴을 만드는 방법은 아래 사항이 포함되면 된다.

var once sync.Once
var instance *singleton

func GetInstance() *singleton {
	if instance == nil {
		once.Do(func() {
			instance = new(singleton)
		})
	}
	return instance
}