Skip to content

Instantly share code, notes, and snippets.

@nasa9084
Created July 20, 2019 02:10
Show Gist options
  • Save nasa9084/3e2afcb094f511cadb4ac3e4d5d44fc3 to your computer and use it in GitHub Desktop.
Save nasa9084/3e2afcb094f511cadb4ac3e4d5d44fc3 to your computer and use it in GitHub Desktop.

Go言語の実装パターン

他の言語同様、Go言語にも、実装パターン・デザインパターンの様なものがあります。 それは他の言語でも使われるようなものであったり、Go言語独自のものであったりします。 本稿では、Go言語の実装パターンをいくつか紹介します。

Functional Option Pattern

Go言語では、関数の引数に規定値を持たせたり、一部の引数のみを選んで値を与えたり、ということができません。 そのため、指定しても指定しなくてもいいような、オプションの引数を作りたいと思うと、あまり単純には書くことができません。

そういった、オプションの引数を実現するのがFunctional Option Patternです。 Go言語において、関数は第一級オブジェクトです。そのため、関数の引数として関数を与える、あるいは関数の返値として関数を返す、といったことが可能です。例えば、次の関数は関数を引数にとって、関数を返す関数です。play

func NeedFunc(fn func() int) func() int {
  return func() int {
      v := fn()       // 引数の関数を実行して
      log.Println(v)  // 返値をログとって
      return v        // 返値を返す
  }
}

デザインパターンを学習済みの型であれば、Decorator patternの一種だ、と思うかもしれません。

Concurrency Patterns

Fan-In/Fan-Out Pattern

Future/Promise Pattern

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment