对二维数组进行切片

Slicing a two dimensional array

提问人:elklepo 提问时间:10/11/2023 最后编辑:Jonathan Hallelklepo 更新时间:10/11/2023 访问量:55

问:

我正在努力学习利用切片提供的所有好处。

我为自己创建的挑战任务是为二维数组(偶数维)创建一个切片,以便可以从 .0len(matrix/2)

我编写了一个代码来实现这个挑战(矩阵维度现在硬编码为 4 - 见问题):2.

package main

import (
    "fmt"
    "strings"
)

// print matrix
// TODO: remove hardcoded dimension by accepting slice instead of array
func printMatrix(matrix [4][4]int) {
    fmt.Println("+", strings.Repeat("-", 2*len(matrix)-1), "+")
    for i := 0; i < len(matrix); i++ {
        fmt.Println("|", strings.Trim(strings.Join(strings.Fields(fmt.Sprint(matrix[i])), " "), "[]"), "|")
    }
    fmt.Println("+", strings.Repeat("-", 2*len(matrix)-1), "+")
}

const MatrixDim = 4

func main() {
    // init matrix
    matrix := [MatrixDim][MatrixDim]int{}

    // print matrix initial state
    printMatrix(matrix)

    // initialize lower right quadrant view
    matrixView := make([][]int, MatrixDim/2)
    for i := 0; i < MatrixDim/2; i++ {
        matrixView[i] = matrix[i+MatrixDim/2][MatrixDim/2:]
    }

    // modify lower right quadrant using the 0-indexed view
    matrixView[0][0] = 1
    matrixView[0][1] = 2
    matrixView[1][0] = 3
    matrixView[1][1] = 4

    // print modified matrix
    printMatrix(matrix)
}

/*
OUTPUT:
+ ------- +
| 0 0 0 0 |
| 0 0 0 0 |
| 0 0 0 0 |
| 0 0 0 0 |
+ ------- +
+ ------- +
| 0 0 0 0 |
| 0 0 0 0 |
| 0 0 1 2 |
| 0 0 3 4 |
+ ------- +
*/

  1. 我想知道是否有一种更简单、更干净的方法来为右下象限创建 0 索引视图(没有初始化循环)
  2. 说到好的做法 - 我知道应该接受或指针作为参数(而不是)。我想知道是否最好定义 as 并将其指针/切片传递给,或者我应该从一开始就将其定义为 a?printMatrix()slicearrayarraymatrixarrayprintMatrix()slice
数组 切片

评论

0赞 Victor Vieira 10/11/2023
1. 不是,我知道。2. Go 中的切片总是通过引用传递。array 和 slice 之间没有区别,它们在 go 中是一样的。
0赞 Sarath Sadasivan Pillai 10/11/2023
@VictorVieira数组不同于 Go 中的切片。数组是一种值类型,具有固定长度等,而切片是一种引用类型。大多数时候,你会处理
0赞 Victor Vieira 10/11/2023
@Sarath Sadasivan Pillai,是的,我知道。我的意思是,它们可以被视为同一事物,因为一个是另一个的具体表示。说 1 和 int 是一回事。他不需要在他的函数中制定严格的规则来处理数组/切片。唯一值得做的是,如果它能为了解确切的值或数组大小带来好处。否则就不需要这么严格了

答: 暂无答案