Go言語でシングルトンを作ってみました

June 19 2011, 12:25am

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

Your favourite external commenting service goes here! I recommend http://www.disqus.com