首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go函数点表示法

Go函数点表示法
EN

Stack Overflow用户
提问于 2017-07-22 15:50:43
回答 2查看 3.2K关注 0票数 2

我想建造这个:

代码语言:javascript
复制
finalResult, err := Function1(whatever type)
    .Function2(whatever type)
    .Function3(whatever type)

类似于javascript中的承诺,但不一定是相同的概念。或者类似于Java中的嵌套方法。我只是假装避免为相同的任务编写更多的代码。

我不想这么做:

代码语言:javascript
复制
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 {...}

我已经尝试了几种带有结构和接口的选项,但是我无法得到任何结果。

如果我在语法上出了错,我就道歉。我的英语水平还不太好。

谢谢,

大卫

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-22 16:56:33

我认为你指的是Fluent API设计模式。您可以一次又一次地返回相同的对象或结构。

但是,此模式不允许您返回一个元组或多个返回类型。只能返回一个对象。

https://play.golang.org/p/9PceZwi1a3

代码语言:javascript
复制
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调用中的错误。

因为你是新来的,请记住评估所有的答案,并给出你相信的最好的答案。

票数 4
EN

Stack Overflow用户

发布于 2017-07-22 16:49:59

要做到这一点,唯一的方法是让每个FunctionX都是接收器上的一个方法(很可能是一个指针接收器,如果您是在变异状态的话),并让它们每个返回接收器。就像这样

代码语言:javascript
复制
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上设置和错误,并在最后检查它。

如果您希望真正执行错误,那么您将需要这样做。

代码语言:javascript
复制
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中并不存在这种错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45256433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档