我知道如何创建这样的2D切片。
var data []int
data = make([]int, w*h)
v := make([][]int, h)
for i := 0; i < h; i++ {
v[i] = data[w*i : w*(i+1)]
}
由于这非常冗长,我将创建其中的许多内容,因此我决定将其重构为函数。
func create2dSlice(w, h int) [][]int {
var data []int
data = make([]int, w*h)
v := make([][]int, h)
for i := 0; i < h; i++ {
v[i] = data[w*i : w*(i+1)]
}
return v
}
func main() {
a := create2dSlice(3, 2)
}
这仅适用于整数。 golang中有没有办法为其他类型重用相同的代码执行此操作?
我来自C ++,我希望能够做到这样的事情。
create2dSlice<int>(w, h)
答案 0 :(得分:2)
Go没有泛型。对于矩阵,类似的问题,我在NewMatrix
文件夹的matrix.go
文件中有snippet
函数。根据设计,我可以简单地复制它并将[]int
全局更改为其他类型,例如[]float64
。
您可以通过为w
切片提供有效容量来改善您的功能。
例如,
package main
import "fmt"
func NewMatrix(r, c int) [][]int {
a := make([]int, c*r)
m := make([][]int, r)
lo, hi := 0, c
for i := range m {
m[i] = a[lo:hi:hi]
lo, hi = hi, hi+c
}
return m
}
func create2dSlice(w, h int) [][]int {
a := make([]int, w*h)
s := make([][]int, h)
lo, hi := 0, w
for i := range s {
s[i] = a[lo:hi:hi]
lo, hi = hi, hi+w
}
return s
}
func main() {
r, c := 2, 3
m := NewMatrix(r, c)
fmt.Println(m)
w, h := c, r
a := create2dSlice(w, h)
fmt.Println(a)
}
输出:
[[0 0 0] [0 0 0]]
[[0 0 0] [0 0 0]]
The Go Programming Language Specification
切片表达式从字符串数组构造子字符串或切片, 指向数组或切片的指针。有两种变体:一种简单的形式 指定低限和高限,以及指定a的完整形式 受限于能力。
完整切片表达式
对于数组,指向数组的指针,或切片a(但不是字符串), 主要表达
a[low : high : max]
构造一个相同类型的切片,并且具有相同的长度和 元素作为简单切片表达式
a[low : high]
。另外, 它通过将切片的容量设置为max - low
来控制切片的容量。
答案 1 :(得分:0)
只有两个方法可以提供int或字符串2d切片。 Golang没有泛型。
答案 2 :(得分:0)
进一步了解这一点。 Go希望你输入它的原因是因为它使代码更清晰。在平衡代码清晰度和代码重复时,请务必清楚。许多语言采用这种平衡的“无重复代码”方面,但降低清晰度是一种权衡。如果它非常重要,你确实有一些选择。 1.为所有可能的返回类型创建一个接口。例如,您可以返回[] []数字。 2.创建一个包含具有传输方法的2d数组的结构,即NumberArray.AsInts() 3.返回空接口并使用反射。