## 靜態成員(static member)
這個模式只用在很稀少的場景,你需要某個struct類型的所有的實例需要共享同一個值。 我最近偶然發現的一個例子是出于調試目的:一個接口`I`實現了`Kind() string`函數,用來在日志系統中打印類型。
這太容易實現了,而且也不會弄亂包命名空間:
~~~
type myImpl struct{}
func (*myImpl) Kind() string {
return "Best implementation"
}
~~~
注意`Kind()`需要一個指針類型的receiver,但是它并沒有為這個receiver命名,所以很清晰的表明我們并不使用類型實例。
## 錯誤組(Errgroup)
有時候你想創建多個goroutine,讓它們并行地工作,當遇到某種錯誤或者你不像再輸出了,你可能想取消整個goroutine。
為了取得這個效果你可以使用 sync.Waitgroup 和 context.Context 是可行的,但是這得需要很多冗余代碼,我建議使用[errgroup.Errgroup](https://godoc.org/golang.org/x/sync/errgroup)。
例子:
~~~
import "golang.org/x/sync/errgroup"
......
eg, ctx := errgroup.WithContext(context.TODO())
for _, w := range work {
w := w
eg.Go(func() error {
// Do something with w and
// listen for ctx cancellation
})
}
// If any of the goroutines returns an error ctx will be
// canceled and err will be non-nil.
if err := eg.Wait(); err != nil {
return err
}
~~~