How does one implement the Singleton design pattern in the go programming language?
Before trying to find a way to bend Go to your will, you might want to take a look at some articles:
In summary, over time people have found singletons to be less than optimal, and imho especially if you are trying to do any test-driven development: on many levels they are pretty much as bad as global variables.
[disclaimer: I know its not a strict answer to your question but it really is relevant]
Just put your variables and functions at the package level.
Also see similar question: How to make a singleton in Python
Just have a single static, final, constant, global, application-wide instance of the Object you want.
This however contradicts the OO paradigm. Its use should be limited to primitives and immutable objects, not to mutable objects.
You can do initialization using the once package:
This will ensure that your init methods only get called once.
Setting aside the argument of whether or not implementing the singleton pattern is a good idea, here's a possible implementation:
package singleton
type single struct {
O interface{};
}
var instantiated *single = nil
func New() *single {
if instantiated = nil {
instantiated = new(single);
}
return instantiated;
}
single
and instantiated
are private, but New()
is public. Thus, you can't directly instantiate single
without going through New()
, and it tracks the number of instantiations with the private boolean instantiated
. Adjust the definition of single
to taste.
See also, hasan j's suggestion of just thinking of a package as a singleton.