更新一片切片中的一个位置会导致多次更新
updating one position in a slice of slices results in multiple updates
我正在学习围棋和玩 slices 但我遇到了问题
我有一个带有“.”的默认矩阵,但是当我尝试将位置 0,0 更改为“#”符号时,所有 n,0 位置都有一个“#”,换句话说,我开始有了这个:
[. . . . .]
[. . . . .]
[. . . . .]
[. . . . .]
[. . . . .]
用这个函数修改0,0位置:
func drawSym(table *[][]string) {
(*table)[0][0] = "#"
}
然后我得到
[# . . . .]
[# . . . .]
[# . . . .]
[# . . . .]
[# . . . .]
当我想要这样的矩阵时
[# . . . .]
[. . . . .]
[. . . . .]
[. . . . .]
[. . . . .]
程序的完整代码在 playground https://play.golang.org/p/xvkRhmNvdIP
如果矩阵大小不变,则无需传递指向您的切片(或切片的切片)的指针。
因此,您可以像这样简化 table 的 creation/initialization:
func createTable(size int) (table [][]string) {
table = make([][]string, size)
for i := 0; i < size; i++ {
table[i] = make([]string, size) // create a new row per iteration
for j := 0; j < size; j++ {
table[i][j] = "."
}
}
return
}
table := createTable(5)
draw
和 print
函数也被简化了——因为它们也不需要切片指针:
按如下方式修改您的代码,这样您就不会在所有行中获得相同的值,为每次迭代创建一个新行而不是使用相同的行。
package main
import (
"fmt"
)
func main() {
table := make([][]string, 5)
initTable(table)
printTable(table)
drawSym(table)
printTable(table)
}
func drawSym(table [][]string) {
(table)[0][0] = "#"
(table)[1][1] = "%"
}
func initTable(table [][]string) {
for i := 0; i < len(table); i++ {
table[i] = make([]string, len(table))
for j := 0; j < len(table); j++ {
table[i][j] = "."
}
}
}
func printTable(table [][]string) {
for i := 0; i < len(table); i++ {
fmt.Println((table)[i])
}
}
输出:
[. . . . .]
[. . . . .]
[. . . . .]
[. . . . .]
[. . . . .]
[# . . . .]
[. % . . .]
[. . . . .]
[. . . . .]
[. . . . .]
如果矩阵的大小固定,则可以使用数组而不是切片 ([5][5]string
)。为了防止代码重复并简化维护,您可以为该矩阵创建一个所需长度的类型 (type myMatrix [5][5]string
) 并在您的代码中使用该类型 (func printTable(table myMatrix)
).
比如
package main
import (
"fmt"
)
type myMatrix [5][5]string
func main() {
var table myMatrix
for i := 0; i < len(table); i++ {
for j := 0; j < len(table); j++ {
table[i][j] = "."
}
}
table[0][0] = "#"
printTable(table)
}
func printTable(table myMatrix) {
for i := 0; i < len(table); i++ {
fmt.Println(table[i])
}
}
我正在学习围棋和玩 slices 但我遇到了问题
我有一个带有“.”的默认矩阵,但是当我尝试将位置 0,0 更改为“#”符号时,所有 n,0 位置都有一个“#”,换句话说,我开始有了这个:
[. . . . .]
[. . . . .]
[. . . . .]
[. . . . .]
[. . . . .]
用这个函数修改0,0位置:
func drawSym(table *[][]string) {
(*table)[0][0] = "#"
}
然后我得到
[# . . . .]
[# . . . .]
[# . . . .]
[# . . . .]
[# . . . .]
当我想要这样的矩阵时
[# . . . .]
[. . . . .]
[. . . . .]
[. . . . .]
[. . . . .]
程序的完整代码在 playground https://play.golang.org/p/xvkRhmNvdIP
如果矩阵大小不变,则无需传递指向您的切片(或切片的切片)的指针。
因此,您可以像这样简化 table 的 creation/initialization:
func createTable(size int) (table [][]string) {
table = make([][]string, size)
for i := 0; i < size; i++ {
table[i] = make([]string, size) // create a new row per iteration
for j := 0; j < size; j++ {
table[i][j] = "."
}
}
return
}
table := createTable(5)
draw
和 print
函数也被简化了——因为它们也不需要切片指针:
按如下方式修改您的代码,这样您就不会在所有行中获得相同的值,为每次迭代创建一个新行而不是使用相同的行。
package main
import (
"fmt"
)
func main() {
table := make([][]string, 5)
initTable(table)
printTable(table)
drawSym(table)
printTable(table)
}
func drawSym(table [][]string) {
(table)[0][0] = "#"
(table)[1][1] = "%"
}
func initTable(table [][]string) {
for i := 0; i < len(table); i++ {
table[i] = make([]string, len(table))
for j := 0; j < len(table); j++ {
table[i][j] = "."
}
}
}
func printTable(table [][]string) {
for i := 0; i < len(table); i++ {
fmt.Println((table)[i])
}
}
输出:
[. . . . .]
[. . . . .]
[. . . . .]
[. . . . .]
[. . . . .]
[# . . . .]
[. % . . .]
[. . . . .]
[. . . . .]
[. . . . .]
如果矩阵的大小固定,则可以使用数组而不是切片 ([5][5]string
)。为了防止代码重复并简化维护,您可以为该矩阵创建一个所需长度的类型 (type myMatrix [5][5]string
) 并在您的代码中使用该类型 (func printTable(table myMatrix)
).
比如
package main
import (
"fmt"
)
type myMatrix [5][5]string
func main() {
var table myMatrix
for i := 0; i < len(table); i++ {
for j := 0; j < len(table); j++ {
table[i][j] = "."
}
}
table[0][0] = "#"
printTable(table)
}
func printTable(table myMatrix) {
for i := 0; i < len(table); i++ {
fmt.Println(table[i])
}
}