我想建立这个:
finalResult, err := Function1(whatever type)
.Function2(whatever type)
.Function3(whatever type)
类似于javascript中的promises,但不一定是相同的概念。或者类似于Java中的嵌套方法。我只是假装为相同的任务避免使用更多代码。
我不想这样做:
result, err := new(Function1(whatever type)) //or *Function1(whatever type)
if err != nil {...}
result1, err := result.Function2(whatever type)
if err != nil {...}
finalResult, err := result1.Function3(whatever type)
if err != nil {...}
我一直尝试使用结构和界面的几个选项,但我无法获得任何结果。
如果我的语法有误,我道歉。我的英语水平还不是很好。
谢谢,
大卫
答案 0 :(得分:1)
我认为您的意思是Fluent API设计模式。你一遍又一遍地在Go中返回相同的Object或结构。
此模式不允许您返回元组或多个返回类型。您只能返回一个对象。
https://play.golang.org/p/9PceZwi1a3
package main
import (
"fmt"
)
type Object struct {
Value string
Error error
}
func (o *Object) Before(s string) *Object {
o.Value = s + o.Value
// add an error if you like
// o.Error = error.New(...)
return o
}
func (o *Object) After(s string) *Object {
// could check for errors too
if o.Error != nil {
o.Value = o.Value + s
}
return o
}
func main() {
x := Object{}
x.
Before("123").
After("456").
After("789").
Before("0")
if x.Error != nil {
// handle error
}
fmt.Println(x.Value)
}
编辑:sberry的回答有个好主意。在Object
结构本身上添加一个错误状态,这可以让你检查每个func调用中的错误。
由于您是新手,请记得评估所有答案并标记您认为最能引导您答案的答案。
答案 1 :(得分:0)
执行此操作的唯一方法是让每个FunctionX
成为接收器上的方法(如果您正在改变状态,很可能是指针接收器)并让它们各自返回接收器。像这样
type someNumber struct {
n int32
}
func (s *someNumber) Add(i int32) *someNumber {
s.n += i
return s
}
func (s *someNumber) Multiply(i int32) *someNumber {
s.n *= i
return s
}
func (s *someNumber) Subtract(i int32) *someNumber {
s.n -= i
return s
}
func main() {
num := &someNumber{n: 0}
result := num.Add(5).Multiply(4).Subtract(10)
fmt.Println(result.n)
}
您也可以在someNumber
上设置和错误,并在结尾处进行检查。
如果您希望实际执行错误,那么您需要执行类似的操作。
func Function1(a int, err error) (int, error) {
if err != nil {
return a, err
}
return a, nil
}
func Function2(a int, err error) (int, error) {
if err != nil {
return a, err
}
return a*2, nil
}
func Function3(a int, err error) (int, error) {
if err != nil {
return a, err
}
return a*3, nil
}
func main() {
a, err := Function3(Function2(Function1(1, nil)))
fmt.Println(a, err)
}
但是,看起来你正在寻找Error Monad会带来的行为类型,而Go中并不存在这种行为。