去功能点符号

时间:2017-07-22 15:50:43

标签: go

我想建立这个:

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 {...}

我一直尝试使用结构和界面的几个选项,但我无法获得任何结果。

如果我的语法有误,我道歉。我的英语水平还不是很好。

谢谢,

大卫

2 个答案:

答案 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中并不存在这种行为。