有没有可能在go语言中创建函数管道,其中一个函数的输出直接按照惯例输入到另一个函数中。
如果不清楚,需要更多信息,请在评论中讨论。
其他函数式语言提供了一些构造,例如在javascript中使用promises
的then
,在java中使用andThen
和lambdas
,以及在c#
中使用FunctionExtensions
。像unix这样的Shell程序也提供了名为pipes |
的构建方法
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
}
所以我们能做类似的事情吗
var obj = TestObj{}
processA(obj)
.then(processB)
.then(processC)
吉姆,第二个例子用的是通道?你能提供一个使用我的代码的代码示例吗?
发布于 2019-06-05 03:49:56
我也在寻找这种模式,但没有任何运气。它在其他语言中很常见,但在戈兰语中却不常见
无论如何,你可能会发现这个有用的https://github.com/open-zhy/fn-pipe
它主要使用reflection来映射函数中的所有输入和输出
发布于 2017-03-16 06:28:47
我也不太确定你想要做什么,但是这里有一个在Go中实现链表的例子。
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)
}
因此,正如您所看到的,可以使用fluent
或builder
接口对方法进行chain
。上例中的IMO是一个合适的地方。https://www.martinfowler.com/bliki/FluentInterface.html
现在,如果你想做一个异步/非阻塞请求,那么我会使用channel/ goroutines。这并不是一个真正的承诺,但如果你愿意,你当然可以处理成功/错误。
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
。
https://stackoverflow.com/questions/42817191
复制相似问题