Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 传入调用另一个func的函数_Go - Fatal编程技术网

Go 传入调用另一个func的函数

Go 传入调用另一个func的函数,go,Go,您好,我有两个类似的函数,我想创建一个通用函数。我的问题是:我不确定如何通过另一个func: func (b *Business) StreamHandler1(sm streams.Stream, p []*types.People) { guard := make(chan struct{}, b.maxManifestGoRoutines) for _, person := range p { guard <- struct{}{} // would

您好,我有两个类似的函数,我想创建一个通用函数。我的问题是:我不确定如何通过另一个func:

func (b *Business) StreamHandler1(sm streams.Stream, p []*types.People) {
    guard := make(chan struct{}, b.maxManifestGoRoutines)
    for _, person := range p {
        guard <- struct{}{} // would block if guard channel is already filled
        go func(n *types.People) {
            b.PeopleHandler(sm, n)
            <-guard
        }(person)
    }
}

func (b *Business) StreamHandler2(sm streams.Stream, pi []*types.PeopleInfo) {
    guard := make(chan struct{}, b.maxManifestGoRoutines)
    for _, personInfo := range pi {
        guard <- struct{}{} // would block if guard channel is already filled
        go func(n *types.PeopleInfo) {
            b.PeopleInfoHandler(sm, n)
            <-guard
        }(personInfo)
    }
}

但这似乎不起作用。关于如何使其通用化,您有什么想法吗?

您可以为所传递的类型创建抽象,并定义特定的接口类型

我使用Peopler接口获取People或PeopleInfo,基于我定义并传递给新StreamHandler的处理程序。如果需要*业务的任何字段/方法,也可以在处理程序中传递*业务

但正如塞尔吉奥所说,如果这个方法只有5行长,即使基本上是一样的,也可能不值得

对于具有guard结构的模式,可以使用更适合的sync.WaitGroup

包干管 进口 fmt 时间 func b*业务流程HandlerSM streamsStream,p[]人员,处理程序funcstreamsStream,人员{ guard:=makechan结构{},b.maxManifestGoRoutines 对于u,人员:=范围p{
guard如果可能,您可以使用依赖项反转来利用接口。类型和函数之间的关联几乎就是方法的定义。因此,使用接口来指定方法定义,并将业务传递给该方法

该接口将是必要的,以防止导入循环,同时使代码更为宽松

通常使用依赖项反转,处理程序将显式地在与业务相同的包中实现接口,但这在Go中都是隐式的

例如:

类型处理程序接口{ 处理业务,流,流 } func b*业务StreamHandler1sm streams.Stream,hs[]处理程序{ guard:=makechan结构{},b.maxManifestGoRoutines 对于u,h:=范围hs{
guard Go没有泛型。接口{}也不是穷人的替代品。因此,只有两个函数更好吗?有没有办法使其泛型?或者不建议使用@SergioTulentsev?
func (b *Business) StreamHandler1(f func(streams.Stream, interface{}), sm streams.Stream, p []*interface{}) {