19014
<http://qiita.com/kitoko552/items/82a4ae6952610bace169>  
上記サイトを参考にGolangでシングルトンパターンのプログラムを書きました。

```

    package meta
    
    type metaWords struct {
        PositiveWords []string
        NegativeWords []string
    }
    
    var sharedInstance = &metaWords{}
    
    // GetInstance is singleton of meta words
    func GetInstance() *metaWords {
        return sharedInstance
    }
    
```

しかしこれだと、`GetInstance()`の箇所で`exported func GetInstance returns unexported type
*meta.metaWords, which can be annoying to use`というGoLintの警告が出ます。

しかし`GetInstance()`を`metaWords`のメソッドにすると警告は消えますが、外部からインスタンスを取得できなくなります。  
このエラーを消すにはどのようにすればいいのでしょうか。Goでシングルトンパターンはどのように実装すればいいのでしょうか。
CC BY-SA 3.0
2015-11-19T02:19:24.440
19013
2015-11-19T02:37:20.797
2015-11-19T02:26:46.270
7232
question
go デザインパターン
Goのシングルトンパターン
構造体を公開するか、公開したくない場合は以下のようにしてください。

  1. `metaWords` が公開するインターフェースを定義し、実装する
  2. `GetInstance()` は構造体ではなくインターフェースを返す

これを手っ取り早く行うと、以下のようになります。

```

    package meta
    
    type MetaWords interface {
        PositiveWords() []string
        NegativeWords() []string
    }
    
    type metaWords struct {
        positiveWords []string
        negativeWords []string
    }
    
    func (m *metaWords) PositiveWords() []string {
        return m.positiveWords
    }
    
    func (m *metaWords) NegativeWords() []string {
        return m.negativeWords
    }
    
    var sharedInstance = &metaWords{}
    
    // GetInstance is singleton of meta words
    func GetInstance() MetaWords {
        return sharedInstance
    }
    
```
CC BY-SA 3.0
2015-11-19T02:37:20.797
19014
2015-11-19T02:37:20.797
208
19013
answer