Go言語がわかってきたので、簡単なシングルトンを作ってみました。

singleton.go

package singleton

type Singleton struct {
	resources map[string] string
}

var instance *Singleton = nil

func newSingleton() *Singleton {
	ins := new(Singleton)
	ins.resources = make(map[string] string)
	return ins
}

func Instance() *Singleton {
	if instance == nil {
		instance = newSingleton()
	}
	return instance
}

func (this *Singleton)Resource(key string) string {
	return this.resources[key]
}

func (this *Singleton)SetResource(key, value string) {
	this.resources[key] = value
}

func (this *Singleton)Clear() {
	this.resources = make(map[string] string)
}

Go言語の慣例では、複数の単語から成る名前をつけるときはアンダースコアを使わずに、MixedCapsまたはmixedCapsのように単語の先頭だけ大文字を用います。そして名前の先頭の文字が大文字であれば、パッケージ外に公開することができます。

このシングルトンの例では、Singleton型は外部に公開していますが、メンバは公開していません。Singleton型のメンバへは、公開メソッド(Instance(), Resource(), SetResource(), Clear())によってのみ、アクセスすることが許されます。

使用例は、次のようになります。

package main

import "./singleton"

func main() {
	println(singleton.Instance().Resource("hoge"))	
	singleton.Instance().SetResource("hoge", "fuga")
	println(singleton.Instance().Resource("hoge"))	
	singleton.Instance().Clear()
	println(singleton.Instance().Resource("hoge"))	
}

Go言語はクラスや継承等の概念はないですが、パッケージや構造体をうまく使い分けて設計することで、ピュアなオブジェクト指向っぽいプログラミングが可能ですね。