将通道中的值传递给Golang中的可变参数函数

时间:2014-10-13 09:36:58

标签: go

我正在Golang编写一个机器人操作库,我使用了skelterjohn / go.matrix库中的matrix.Product(a * matrix.DenseMatrix,bs ... * matrix.DenseMatrix)形式的函数用于乘法矩阵。可以看出,第一个参数是一个静态参数,在某种意义上说,只有一个参数在那里,第二个参数是一个可变参数,在某种意义上,多个参数可以去那里。所以假设我有6个关节,每个关节对应于我的代码形式struct {matrix,angle}中的结构。我将这6个结构存储在一个数组中,并将它们传递给一个函数,该函数从这个结构数组中提取每个矩阵并将它们放入缓冲通道中。现在,这里是我逻辑分解的地方.... O_O!。如何编写代码,以便提取此通道中的6个矩阵并将其作为参数放在上面的Product函数中? 我尝试执行上述操作的代码如下:

    // Struct with a matrix and angle
    type TwistnTheta struct {
        Tw *gm.DenseMatrix
        Th float64
    }

    // Param : arr - Array of structs
    // Param : defConf - Default Orientation struct
    func ReqFinalConfig(arr []TwistnTheta, defConf DefaultOrientation) *gm.DenseMatrix {
        ch1 := make(chan *gm.DenseMatrix, len(arr))
        for i := 0; i < len(arr); i++ {
            ch1 <- HomConfig(arr[i].Tw.Array(), &arr[i].Th) //Pushes matrices into channel
            //fmt.Println(<-ch1, "\n")
        }
        // I extract values from the channels manually and pass them into the function....
        // I want to automate this argument passing....
        return gm.Product(<-ch1 , <-ch1, <-ch1, <-ch1, defConf.ReqDefConfig())
    }

编辑:弄清楚逻辑,这就是我做的,

    func ReqFinalConfig(arr []TwistnTheta, defConf DefaultOrientation) *gm.DenseMatrix {
        ch1 := make(chan *gm.DenseMatrix, len(arr))
        //var m1 *gm.DenseMatrix
        for i := 0; i < len(arr); i++ {
            ch1 <- HomConfig(arr[i].Tw.Array(), &arr[i].Th)
            //fmt.Println(HomConfig(arr[i].Tw.Array(), &arr[i].Th), "\n")
        }
        close(ch1)
        return extractChan(ch1,defConf)
    }

    func extractChan(ch chan *gm.DenseMatrix, defConf DefaultOrientation) *gm.DenseMatrix {
        var Ms []*gm.DenseMatrix
        ms1 := <-ch
        for val := range ch {
            Ms = append(Ms,val)
        }
        for i := 0; i < len(Ms); i++ {
            ms1 = gm.Product(ms1, Ms[i])
        }
        return gm.Product(ms1, defConf.ReqDefConfig())
    }

0 个答案:

没有答案