doumeitang572461 2017-11-05 10:51
浏览 76
已采纳

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

I know how to create a 2D slice like this.

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)]
}

Since this is very verbose and I'm going to create many of these, I decided to refactor it into a function.

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)
}

This works only for integers. It there any way in golang to do this for other types reusing the same code?

I come from C++ and I would expect to be able to do something like this.

create2dSlice<int>(w, h)
  • 写回答

3条回答 默认 最新

  • douzhechi2435 2017-11-05 21:41
    关注

    Go doesn't have generics. For matrices, a similar problem, I have a NewMatrix function in a matrix.go file in my snippet folder. By design, I can simply copy it and do a global change of []int to another type, for example, []float64.

    You could improve your function by giving w slices a valid capacity.

    For example,

    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)
    }
    

    Output:

    [[0 0 0] [0 0 0]]
    [[0 0 0] [0 0 0]]
    

    The Go Programming Language Specification

    Slice expressions

    Slice expressions construct a substring or slice from a string, array, pointer to array, or slice. There are two variants: a simple form that specifies a low and high bound, and a full form that also specifies a bound on the capacity.

    Full slice expressions

    For an array, pointer to array, or slice a (but not a string), the primary expression

    a[low : high : max]
    

    constructs a slice of the same type, and with the same length and elements as the simple slice expression a[low : high]. Additionally, it controls the resulting slice's capacity by setting it to max - low.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 vs2022无法联网
  • ¥15 TCP的客户端和服务器的互联
  • ¥15 VB.NET操作免驱摄像头
  • ¥15 笔记本上移动热点开关状态查询
  • ¥85 类鸟群Boids——仿真鸟群避障的相关问题
  • ¥15 CFEDEM自带算例错误,如何解决?
  • ¥15 有没有会使用flac3d软件的家人
  • ¥20 360摄像头无法解绑使用,请教解绑当前账号绑定问题,
  • ¥15 docker实践项目
  • ¥15 利用pthon计算薄膜结构的光导纳