在我正在编写的golang包中,我经常需要发出2个HTTP请求来获取所需的数据。
我的包包含客户端函数,这些函数通常没有参数,返回一个结构和一个错误。
第一个月
然而,我希望能够编写一个泛型函数,它可以接受其中两个客户端函数作为参数,并发地运行它们,并简单地返回填充了来自API的数据的结构体。
理想情况下,我希望函数调用如下所示:
struct1, struct2, err := rrunFunctions(client.GetProduct, client.GetSizes)
到目前为止,我已经编写了以下泛型函数:https://go.dev/play/p/IA8LJqY0FPe
问题是,由于GetProduct
和GetSizes
都返回struct
和error
,而不是interface{}
和error
,因此我在编译时得到以下错误:
./prog.go:54:28: cannot use client.GetProduct (value of type func() (*Product, error)) as type func() (interface{}, error) in argument to runFunctions
./prog.go:54:47: cannot use client.GetSizes (value of type func() (*Sizes, error)) as type func() (interface{}, error) in argument to runFunctions
我的问题是如何克服这一点?在go中编写这样的泛型函数是可能的吗?
任何关于以这种方式使用并发的一般提示也将受到欢迎。
1条答案
按热度按时间t9eec4r01#
是的,使用泛型是可能的。为函数的2个返回类型使用2个类型参数:
注:
defer
调用wg.Done()
wg.Wait()
之后的错误!使用它也变得更简单,因为你不必处理类型Assert:
这将输出(在Go Playground上尝试):