首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >go语言中的函数管道

go语言中的函数管道
EN

Stack Overflow用户
提问于 2017-03-16 01:52:24
回答 2查看 1.1K关注 0票数 0

有没有可能在go语言中创建函数管道,其中一个函数的输出直接按照惯例输入到另一个函数中。

如果不清楚,需要更多信息,请在评论中讨论。

其他函数式语言提供了一些构造,例如在javascript中使用promisesthen,在java中使用andThenlambdas,以及在c#中使用FunctionExtensions。像unix这样的Shell程序也提供了名为pipes |的构建方法

代码语言:javascript
复制
func processA(test TestObj) {
    // do something
    return test
}

func process B(test TestObj) {
    //do something
    return test
}

func processC(test TestObj) {
    //do something
    return test
}

所以我们能做类似的事情吗

代码语言:javascript
复制
var obj = TestObj{}

processA(obj)
   .then(processB)
    .then(processC)

吉姆,第二个例子用的是通道?你能提供一个使用我的代码的代码示例吗?

EN

回答 2

Stack Overflow用户

发布于 2019-06-05 03:49:56

我也在寻找这种模式,但没有任何运气。它在其他语言中很常见,但在戈兰语中却不常见

无论如何,你可能会发现这个有用的https://github.com/open-zhy/fn-pipe

它主要使用reflection来映射函数中的所有输入和输出

票数 2
EN

Stack Overflow用户

发布于 2017-03-16 06:28:47

我也不太确定你想要做什么,但是这里有一个在Go中实现链表的例子。

代码语言:javascript
复制
package main

import "fmt"

type LinkedList struct {
    value interface{}
    next  *LinkedList
}

func (oldNode *LinkedList) prepend(value interface{}) *LinkedList {
    return &LinkedList{value, oldNode}
}

func tail(value interface{}) *LinkedList {
    return &LinkedList{value, nil}
}

func traverse(ll *LinkedList) {
    if ll == nil {
        return
    }
    fmt.Println(ll.value)
    traverse(ll.next)
}

func main() {
    node := tail(5).prepend(6).prepend(7)
    traverse(node)
}

因此,正如您所看到的,可以使用fluentbuilder接口对方法进行chain。上例中的IMO是一个合适的地方。https://www.martinfowler.com/bliki/FluentInterface.html

现在,如果你想做一个异步/非阻塞请求,那么我会使用channel/ goroutines。这并不是一个真正的承诺,但如果你愿意,你当然可以处理成功/错误。

代码语言:javascript
复制
func NonBlockingGet(url string) <-chan []byte {
    c := make(chan []byte, 1)

    go func() {
        var body []byte
        defer func() {
            c <- body
        }()

        res, err := http.Get(url)
        if err != nil {
            return
        }
        defer res.Body.Close()

        body, _ = ioutil.ReadAll(res.Body)
    }()

    return c
}

func main() {
    promise := NonBlockingGet("http://example.com")

    // can do other stuff here - because doing a non-blocking get request.
    log.Println("This will output before the response length")

    body := <- promise // Will wait here till promise is resolved.
    log.Printf("response length: %d", len(body))
}

我希望这能有所帮助。正如上面评论中所说的,这不是javascript,我们也不应该尝试这样做。但是,您可以始终将<- promise作为参数传递到函数中,而不是将<- promise赋值给body

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

https://stackoverflow.com/questions/42817191

复制
相关文章

相似问题

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