Golang中国

用传统的python/perl的思维,赋值二维切片,被虐的一塌糊涂:

package main

import (
    "fmt"
)

func main() {

    var arrResults [][]string

    count := 5
    for i := 0; i < count; i++ {

        for j := 0; j < 15; j++ {
            arrResults[i][j] = "a"

        }

        arrResults = append(arrResults, arrResults[i])

    }

    fmt.Println(arrResults)
}

直接提示越界,蛋疼的是,还不知道为啥越界:

command-line-arguments
panic: runtime error: index out of range

goroutine 1 [running]:
panic(0x4c45a0, 0x109b0008)
    c:/go/src/runtime/panic.go:464 +0x326
main.main()
    D:/Coding/anotherSliceTest.go:15 +0x227
exit status 2

后来用了slice的特性,逐级赋值,并且对比map的赋值过程,在此记录一下,正确的内容:

package main

import (
    "fmt"
)

func main() {
    mapResults := make(map[int]string)
    var arrResults [][]string

    count := 5
    for i := 0; i < count; i++ {
        valueStr := fmt.Sprintf("this is %d", i)
        mapResults[i] = valueStr
        var tmpArr []string

        for j := 0; j < 15; j++ {
            tmpArr = append(tmpArr, "a")

        }

        arrResults = append(arrResults, tmpArr)

    }

    fmt.Println(mapResults)
    fmt.Println(arrResults)
}


总结一下,就是多维的slice赋值,一定从最里层形成一个slice,然后自里向外逐层append即可。

像demo这种情况下,更推荐用map接受数据
3 回复
ssqq
#1 ssqq • 2016-10-01 01:22

var arrResults [][]string
// ==>
arrResults := [][]string{}

xjjrocker
#2 xjjrocker • 2017-05-19 13:46

mark!学习了。

lifesohard
#3 lifesohard • 2017-05-22 11:59
const LOOP_COUNT = 5
const LOOP_NUM = 10
func main() {
    var s [][]string
    for i := 0; i < LOOP_COUNT; i++ {
        sl := make([]string,0,LOOP_NUM)
        for j := 0; j < LOOP_NUM; j++ {
            sl = append(sl,"a")
        }
        s = append(s,sl)
    }
    fmt.Println(s)
}
需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。