使用同步包中断链接方法

Break chaining methods using sync package

上次我发现我不必检查变量是否为 nil 来创建单例服务,但我可以使用 sync.Once 来获得相同的结果,示例如下:

// instead of
var instance Instance
func NewInstance() {
    if instance == nil {
        instance = Instance{}
    }
    return instance
}

// can do this
var (
    once sync.Once
    instance Instance
)
func NewInstance() {
    once.Do(func() {
        instance = Instance{}
    })
    return instance
}

我的问题是: 我可以使用 sync 包来破坏链接规则和 return 错误吗?

想要的结果:

var (
    breakChain sync.SomethingToBreakChain
    err error
)

type s struct {}

func (s *s) F1() s {
    err = service1.DoSomething()
    // sync do something
    return s
}
func (s *s) F2() s {
    err = service2.DoSomething()
    // sync do something
    return s
}
func (s *s) F3() s {
    err = service3.DoSomething()
    // sync do something
    return s
}
func (s *s) GetError() {
    return err
}

func New() {
    s := s{}
    s.F1(). // if error save to `err` variable and break chain here prevent `F2` and `F3` to execute
      F2(). // if error save to `err` variable and break chain here prevent `F3`  to execute
      F3() // if error save to `err` to return
    err := s.GetError()
    // do something with `err`
}

如果你想实现这样的链,你可以考虑在接收器本身中保存错误并检查每个动作:

type s struct {
  e error
}

func (s *s) F1() *s {
  if s.e!=nil {
    return s
  }
  // Do things
  if err:=doThings(); err!=nil {
     s.e=err
  }
  return s
}
...

否则,没有阻止调用链中其他方法的机制。