Go语言用变量定义二维结构体数组报错,如何改用切片实现?
Go中用变量定义二维数组的问题解决方法
问题场景
下面的Go代码可以正常运行,因为数组长度使用的是编译期常量:
package main import ( "fmt" ) type Node struct { north int east int south int west int } func main() { roomsX := 5 roomsY := 5 test := [5][5]Node{} for x := 0; x < roomsX; x++ { for y := 0; y < roomsY; y++ { test[x][y] = Node{} } } fmt.Println(test) fmt.Println(test[0][0].north) fmt.Println(test[4][4].north) }
但如果用变量替代数字定义数组长度,代码会报错:
test := [roomsX][roomsY]Node{}
错误信息:
test2.go:17:11: invalid array length roomsX,
test2.go:17:19: invalid array length roomsY
这是因为Go要求数组的长度必须是编译期可确定的常量,不能用运行时才确定值的变量来定义数组维度。
切片实现方案
用切片就能解决这个问题,切片的长度是动态的,支持运行时用变量指定大小,下面是两种常用实现方式:
方式一:嵌套使用make创建二维切片
package main import ( "fmt" ) type Node struct { north int east int south int west int } func main() { roomsX := 5 roomsY := 5 // 先创建外层切片,长度为roomsX test := make([][]Node, roomsX) // 为每个外层元素创建内层切片,并初始化 for i := range test { // 创建长度为roomsY的内层切片,默认会初始化Node的零值 test[i] = make([]Node, roomsY) // 如果需要自定义初始化Node字段,可以添加内层循环 // for j := range test[i] { // test[i][j] = Node{north: 1} // } } fmt.Println(test) fmt.Println(test[0][0].north) fmt.Println(test[4][4].north) }
方式二:通过循环+append构建二维切片
func main() { roomsX := 5 roomsY := 5 var test [][]Node for x := 0; x < roomsX; x++ { // 创建一行的切片 row := make([]Node, roomsY) // 将行切片添加到外层切片中 test = append(test, row) } // 后续使用逻辑和上面一致 }
切片和数组的核心区别是:数组长度固定且编译期确定,切片长度动态可调整,完全适配你用变量定义维度的需求。
内容的提问来源于stack exchange,提问作者Swiftiti
相关产品推荐
相关产品推荐

