padrão de design go - Singleton

Existem dois principais padrão Singleton: Fórmula preguiçoso e morrendo de fome a fórmula

// fórmula preguiçoso - isenta de segmentos 
// em vez de utilizar com base na estrutura 
tipo struct {Ferramenta 
	valores int 
} 
// compilação variáveis particulares 
var exemplo * Ferramenta 
método de obtenção de objectos únicos // retorna uma transferência de referência 
func GetInstance () * Ferramenta { 
	IF exemplo == {nil 
		exemplo de novos novos = (Tool) 
	} 
	instância retorno 
}

  

// fórmula preguiçoso - isenta de segmentos - de realizar uma operação de fecho de cada operação - não é muito alto desempenho 
// em vez de utilizar com base na estrutura 

tipo struct {Ferramenta 
	valores int 
} 
// compilação particular variáveis 
var exemplo Ferramenta * 
// bloqueio objecto 
var sync.Mutex bloqueio 
// únicas de aquisição objeto método retorna uma transmissão de referência 
FUNC o GetInstance () {* Ferramenta 
	Lock.lock () 
	o lock.unlock defer () 
	IF == exemplo nil { 
		exemplo de novos novos = (Tool) 
	} 
	instância retorno 
}

  

// fórmula preguiçoso - verificados duas vezes 
simultaneamente // base, em seguida, preguiçoso de fórmula (isenta de segmentos) sobre optimizado para reduzir a operação de fecho, não afecta o desempenho do fio de segurança 

// em vez de utilizar com base na estrutura 
tipo struct {Ferramenta 
	valores int 
} 
// bloqueio objeto 
var bloqueio sync.Mutex 
var exemplo * Ferramenta 
// primeiro julgamento não bloqueio, segundo bloqueio para garantir a segurança do segmento, uma vez que o objeto é criado, o objeto não iria ficar preso. 
o GetInstance FUNC () {* Ferramenta 
	IF exemplo nil == { 
		Lock.lock () 
		IF == exemplo nil { 
			exemplo de novos novos = (ferramenta) 
		} 
		lock.unlock () 
	} 
	instância retorno 
}

  

// fome --init de estilo chinês () função para criar 
// thread-safe, o único inconveniente é que o objeto é criado enquanto a introdução de um pacote, e continuam a ocupar na memória 
do tipo struct Ferramenta { 
} 
var Ferramenta Ferramenta * 
// inicializar um exemplos 
FUNC o init () { 
  nova ferramenta novos = (ferramenta) 
} 

// exemplo newconfig fornece um método de obtenção de 
FUNC NewTool () {* Ferramenta 
  Ferramenta de retorno 
}

  

// fome de estilo chinês - para criar uma forma variável global 
// thread-safe, o único inconveniente é que o objeto é criado enquanto a introdução de um pacote, e continuam a ocupar memória
Ferramenta struct {type 
} 
// variável global 
var = new nova ferramenta ferramenta * (Ferramenta) 
// exemplo newconfig fornece um método de obtenção 
newconfig FUNC () {* Ferramenta 
	ferramenta de retorno 
}

Por sync.Once certifique-se de criar um método de objeto é executada apenas uma vez ---- dobro verificado o efeito do juiz sync.Once interna embalados

var uma vez sync.Once 
func GetInstance () * Ferramenta { 
	once.Do (func () { 
		instance = new Tool) ( 
	}) 
	instância de retorno 
}

  

Acho que você gosta

Origin www.cnblogs.com/chen-ya-ping/p/12463422.html
Recomendado
Clasificación