Decorator Pattern in Golang

Decorator パターン既存のオブジェクトに新しい機能や振る舞いを動的に追加することを可能にする。 関数Aに一つの関数Bのタイプを引数として渡して、関数Aに機能追加した後に、同じタイプの関数を返す仕組み。 したのコードは文字列を処理するために、一個の機能を追加する(文字列を小文字にする)。 package main import ( // "encoding/base64" "fmt" "strings" ) type StringManipulator func(string) string func ToLower(m StringManipulator) StringManipulator { return func(s string) string { lower := strings.ToLower(s) return m(lower) } } func ident(s string) string { return s } func main() { s := "Hello Playground" var fn StringManipulator = ident fmt.Println(fn(s)) fn = ToLower(fn) fmt.Println(fn(s)) } https://stackoverflow.com/questions/45944781/decorator-functions-in-go

Golangでの並列処理サンプル

例1 1000個のgoroutineでsomekeyを更新するプログラムで、更新する際にsync.Mutexでロックをかける。 package main import ( "fmt" "sync" "time" ) type SafeCounter struct { v map[string]int mux sync.Mutex } func (c *SafeCounter) Inc(key string) { c.mux.Lock() c.v[key]++ c.mux.Unlock() } func (c *SafeCounter) Value(key string) int { c.mux.Lock() defer c.mux.Unlock() return c.v[key] } func main() { c := SafeCounter{v: make(map[string]int)} for i := 0; i < 1000; i++ { go c.Inc("somekey") } time.Sleep(time.Second) // 待たないとと、974, 949などの値が出てくる fmt.Println(c.Value("somekey")) } 例2 例1はtime.