GoLang:返回任何类型的2d切片

时间:2017-11-05 10:51:57

标签: function go 2d slice

我知道如何创建这样的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)

3 个答案:

答案 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

     

Slice expressions

     

切片表达式从字符串数组构造子字符串或切片,   指向数组或切片的指针。有两种变体:一种简单的形式   指定低限和高限,以及指定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.返回空接口并使用反射。