我想建造这个:
finalResult, err := Function1(whatever type)
.Function2(whatever type)
.Function3(whatever type)类似于javascript中的承诺,但不一定是相同的概念。或者类似于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 {...}我已经尝试了几种带有结构和接口的选项,但是我无法得到任何结果。
如果我在语法上出了错,我就道歉。我的英语水平还不太好。
谢谢,
大卫
发布于 2017-07-22 16:56:33
我认为你指的是Fluent API设计模式。您可以一次又一次地返回相同的对象或结构。
但是,此模式不允许您返回一个元组或多个返回类型。只能返回一个对象。
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)
}编辑:斯伯里的回答有个好主意。在Object结构本身上添加一个错误状态,它允许您检查每个func调用中的错误。
因为你是新来的,请记住评估所有的答案,并给出你相信的最好的答案。
发布于 2017-07-22 16:49:59
要做到这一点,唯一的方法是让每个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)
}但是,似乎您正在寻找Monad可能带来的错误行为类型,而Go中并不存在这种错误。
https://stackoverflow.com/questions/45256433
复制相似问题