【问题标题】:How to declare a 2d array of unknown size如何声明一个未知大小的二维数组
【发布时间】:2021-04-17 04:03:54
【问题描述】:

我这样做是为了实现。

csvData := make([][]string, 100)
for i := range csvData {
                csvData[i] = make([]string, 100)
            }

但我想删除 100,因为我不知道数组的实际大小。我想将一些字符串类型的元素推入二维数组。基本上我正在读取一个 CSV 文件并想提取它的元素并将它们存储在一个二维数组中。这样做的简单方法是什么?

【问题讨论】:

  • @Grizzle。谢谢你的回答。我尝试使用 var csvData [][]string 进行声明,然后运行嵌套循环以将数据以格式放入数组中。在 i 和 j 的 2 个循环内,我分配了 csvData[i][j] = str。但是当我构建它时,它给了我这个错误。恐慌:运行时错误:索引超出范围 [0],长度为 0。您能帮忙解决这个问题吗?
  • @Grizzle 具有误导性 - 切片总是具有可变长度。向make 提供参数只会预分配空间。

标签: arrays go dynamic-arrays


【解决方案1】:

这是一个工作示例,它创建了一个 10 x 10 的切片。

package main

import (
    "fmt"
)

func main() {
    myData := "data"

    var nestedSlice [][]string
    nestedSize := 10

    for i:=0;i<nestedSize; i++ {

        jSlice := []string{}

        for j:=0;j<nestedSize; j++ {
            jSlice = append(jSlice, fmt.Sprintf("row:%v-col:%v-%v", i, j, myData))
        }

        nestedSlice = append(nestedSlice, jSlice)

    }

    fmt.Printf("result: %v\n", nestedSlice)
}

这是显示 10x10 切片的输出。

result: [[row:0-col:0-data row:0-col:1-data row:0-col:2-data row:0-col:3-data row:0-col:4-data row:0-col:5-data row:0-col:6-data row:0-col:7-data row:0-col:8-data row:0-col:9-data] [row:1-col:0-data row:1-col:1-data row:1-col:2-data row:1-col:3-data row:1-col:4-data row:1-col:5-data row:1-col:6-data row:1-col:7-data row:1-col:8-data row:1-col:9-data] [row:2-col:0-data row:2-col:1-data row:2-col:2-data row:2-col:3-data row:2-col:4-data row:2-col:5-data row:2-col:6-data row:2-col:7-data row:2-col:8-data row:2-col:9-data] [row:3-col:0-data row:3-col:1-data row:3-col:2-data row:3-col:3-data row:3-col:4-data row:3-col:5-data row:3-col:6-data row:3-col:7-data row:3-col:8-data row:3-col:9-data] [row:4-col:0-data row:4-col:1-data row:4-col:2-data row:4-col:3-data row:4-col:4-data row:4-col:5-data row:4-col:6-data row:4-col:7-data row:4-col:8-data row:4-col:9-data] [row:5-col:0-data row:5-col:1-data row:5-col:2-data row:5-col:3-data row:5-col:4-data row:5-col:5-data row:5-col:6-data row:5-col:7-data row:5-col:8-data row:5-col:9-data] [row:6-col:0-data row:6-col:1-data row:6-col:2-data row:6-col:3-data row:6-col:4-data row:6-col:5-data row:6-col:6-data row:6-col:7-data row:6-col:8-data row:6-col:9-data] [row:7-col:0-data row:7-col:1-data row:7-col:2-data row:7-col:3-data row:7-col:4-data row:7-col:5-data row:7-col:6-data row:7-col:7-data row:7-col:8-data row:7-col:9-data] [row:8-col:0-data row:8-col:1-data row:8-col:2-data row:8-col:3-data row:8-col:4-data row:8-col:5-data row:8-col:6-data row:8-col:7-data row:8-col:8-data row:8-col:9-data] [row:9-col:0-data row:9-col:1-data row:9-col:2-data row:9-col:3-data row:9-col:4-data row:9-col:5-data row:9-col:6-data row:9-col:7-data row:9-col:8-data row:9-col:9-data]]

根据您的用例,可能有一些方法可以优化 for 循环,因此它的时间复杂度不是 n^2,但这是完全不同的主题。

【讨论】:

    【解决方案2】:

    当创建一个由新数组支持的数组或切片时,您必须提供一个大小,否则编译器无法知道它的大小。但是当声明一个变量来保存在别处创建的数组时,只需将 var 声明为切片,输入 [][]string,这就是您示例中的 cvsData 类型。

    【讨论】:

    • 感谢您的回答。我尝试使用 var csvData[][] 字符串声明它,但是当我需要使用 2 个嵌套循环将值放入其中时(for i in ... { for j in .....{csvData[i][j ]=x;}}。)发生此错误:恐慌:运行时错误:索引超出范围 [0],长度为 0。您能帮忙解决这个问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多