也许它不只是一个Go-Problem,但我遇到了这个问题:
我想将两个(或更多)数组相乘,例如:
a := [3]int{2, 3, 5}
b := [2]bool{true, false}
// desired output of "c" =>
// [[2 true] [2 false] [3 true] [3 false] [5 true] [5 false]]
我已经在这里找到了这个库:https://godoc.org/github.com/gonum/matrix/mat64但是我没有看到如何使用除了float64以外的其他东西
后备解决方案将是使用多个范围循环,但如果有一个更平滑的"它将是惊人的。这样做的方法
答案 0 :(得分:1)
简短回答:go不是针对这类问题的。你想要的是zip
函数的等价物,它本身存在于某些语言中(例如Haskell,Python,......)
但是,在Golang中你会遇到一个大问题:你不能拥有动态类型。即:一个数组只能包含一种类型(int OR bool),而不是几种。解决方法是创建一个接口数组,但这意味着你必须制作丑陋的类型断言才能获得正确的类型。
另外,你确实有一般的方法可以做到这一点,但最后得到的类型是[][]interface{}
,无法知道里面是什么。
对于你的例子:这是做你想要的最简单的方法(不是一般的):
func main() {
a := [3]int{2, 3, 5}
b := [2]bool{true, false}
var c [6][2]interface{}
i := 0
for _, val1 := range a {
for _, val2 := range b {
c[i] = [2]interface{}{val1, val2}
i += 1
}
}
var a1 int = c[0][0].(int)
var b1 bool = c[0][1].(bool)
fmt.Printf("c[0] is %v, a1 is %d and b1 is %v\n", c[0], a1, b1)
fmt.Println(c)
}
正如你所看到的,这在实践中是丑陋无用的(并且非常容易出错)
所以,如果你想进行这种转换,你应该使用另一种语言,Go不是(也不会)为此类目的设计的。
答案 1 :(得分:0)
这不是矩阵乘法,如上所述。如果只有两个东西,两个for循环可以工作,但如果有多个东西,它显然会变得乏味。
我这样做的方法是想到一个多维数组。总数"数字"元素是大小的乘积,然后使用像SubFor https://godoc.org/github.com/btracey/meshgrid#SubFor
这样的函数dims := []int{3,2}
sz := 1
for _,v := range dims {
sz *= v
}
sub := make([]int, len(dims))
for i := 0: i < sz; i++{
meshgrid.SubFor(sub, i, dims)
fmt.Println(a[sub[0]], b[sub[1]])
}
有些东西可以找出类型(附加到切片等),但这应该给你一般的要点。