문제

GO 프로그래밍 언어에서 싱글 톤 디자인 패턴을 어떻게 구현합니까?

도움이 되었습니까?

해결책

싱글 톤 패턴 구현 여부에 대한 주장을 제외하고는 좋은 아이디어입니다. 가능한 구현이 있습니다.

package singleton

type single struct {
        O interface{};
}

var instantiated *single = nil

func New() *single {
        if instantiated == nil {
                instantiated = new(single);
        }
        return instantiated;
}

single 그리고 instantiated 비공개이지만 New() 공개적입니다. 따라서 직접 인스턴스화 할 수 없습니다 single 통과하지 않고 New(), 그리고 개인 부울과 함께 인스턴스화 수를 추적합니다. instantiated. 정의를 조정하십시오 single 맛을보기 위해.

그러나 다른 몇몇과 마찬가지로 유명한, 이것은 싱글 톤을 초기화하지 않는 한 스레드 안전이 아닙니다. init(). 더 나은 접근 방식은 활용하는 것입니다 sync.Once 당신을 위해 노력하는 것 :

package singleton

import "sync"

type single struct {
        O interface{};
}

var instantiated *single
var once sync.Once

func New() *single {
        once.Do(func() {
                instantiated = &single{}
        })
        return instantiated
}

또한 패키지를 생각하는 Hasan J의 제안을 참조하십시오. ~처럼 싱글 톤. 마지막으로, 다른 사람들이 제안하는 것을 고려하십시오. 그 싱글 톤은 종종 문제가있는 구현의 지표입니다.

다른 팁

구부릴 수있는 방법을 찾기 전에 의지에 가서 몇 가지 기사를 살펴볼 수 있습니다.

요약하면, 시간이 지남에 따라 사람들은 싱글 톤이 최적보다 적다는 것을 알았고 IMHO 특히 테스트 중심의 개발을 시도하고 있다면 : 여러 수준에서 글로벌 변수만큼 나쁘다.

면책 조항 : 나는 그것이 당신의 질문에 대한 엄격한 답이 아니라는 것을 알고 있지만 실제로는 관련이 있습니다

변수와 함수를 패키지 레벨에 넣으십시오.

또한 비슷한 질문을 참조하십시오. 파이썬에서 싱글 톤을 만드는 방법

동시 세계에서 우리는이 라인이 원자 적으로 실행되지 않는다는 것을 조금 더 인식해야한다고 생각합니다.

if instantiated == nil {
    instantiated = new(single);
}

@Marketer의 제안을 따르고 패키지 "SYNC"를 사용합니다.

import "sync"

type MySingleton struct {

}

var _init_ctx sync.Once 
var _instance *MySingleton

func New() * MySingleton {
     _init_ctx.Do( func () { _instance = new(MySingleton) }  )
     return _instance 
}

가장 좋은 방법은 다음과 같습니다.

 package singleton

 import "sync"

 type singleton struct {
 }

 var instance *singleton
 var once sync.Once

 func GetInstance() *singleton {
     once.Do(func() {
         instance = &singleton{}
     })
     return instance
 }

당신은 이것을 읽어야합니다 링크

당신은 그것을 사용하여 초기화를 할 수 있습니다 한 번 패키지:

이렇게하면 Init 메소드가 한 번만 호출되도록합니다.

원하는 객체의 정적, 최종, 상수, 글로벌, 응용 프로그램 전체 인스턴스 만 있으면됩니다.

그러나 이것은 OO 패러다임과 모순됩니다. 그것의 사용은 돌연변이 가능한 물체가 아닌 프리미티브와 불변의 대상으로 제한되어야합니다.

당신은 그것을 알고 있어야합니다 Once.Do 코드를 한 번만 실행하는 것에 대해 진지합니다. 즉, 코드는 의미합니다 언제나 당황했을지라도 한 번만 실행되었습니다.

~에서 https://golang.org/pkg/sync/#once.do

F (참고 : 한 번 논리) 패닉 인 경우, 반환 된 것으로 간주합니다. F. F.

이 제한을 극복하기 위해 글로벌 구성 변수의 고유 한 초기화를 보장하기 위해 MUTEXES를 사용했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top