上次我發現我不必檢查變數是否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包來打破鏈接規則并回傳錯誤嗎?
期望的結果:
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`
}
uj5u.com熱心網友回復:
如果您想實作這樣的鏈,您可以考慮將錯誤保存在接收器本身并檢查每個操作:
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
}
...
否則,沒有機制可以阻止呼叫鏈中的其他方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/436598.html
下一篇:在gota中設定列??名
