为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中间接更改结构中的值

在 Go 中间接更改结构中的值

Go
摇曳的蔷薇 2021-12-07 18:42:24
我有以下代码,如果您愿意,请随时提供指示:package mainimport (  "fmt")type Grid struct {  rows int  cols int  tiles []Tile}type Tile struct {  x int  y int  contents int}func (g Grid) AddTile(t Tile) {  g.tiles = append(g.tiles, t)}func (g *Grid) Row(num int) []Tile {  numTiles := len(g.tiles)  row := []Tile{}  for i := 0; i < numTiles; i++ {    tile := g.tiles[i]    if (tile.y == num) {      row = append(row, tile)    }  }  return row}/*  HERE IS WHERE I NEED HELP*/func (g *Grid) SetRow(num, val int) {  row := g.Row(num)  rowLength := len(row)  for i := 0; i < rowLength; i++ {    tile := &row[i]    tile.contents = val  }}func (g Grid) Col(num int) []Tile {  numTiles := len(g.tiles)  col := []Tile{}  for i := 0; i < numTiles; i++ {    tile := g.tiles[i]    if (tile.x == num) {      col = append(col, tile)    }  }  return col}func MakeTile(x, y int) Tile {  tile := Tile{x: x, y: y}  return tile}func MakeGrid(rows, cols int) Grid {  g := Grid{ rows: rows, cols: cols}  for r := 1; r <= rows; r++ {    for c := 1; c <= cols; c++ {      g.tiles = append(g.tiles, MakeTile(r, c))    }  }  return g}func main() {  g := MakeGrid(256, 256)  g.SetRow(100, 5)  fmt.Println(g.Row(100))}我正在做这个,最重要的是,作为一个帮助我学习 Go 的简单项目。遇到的问题就在这里/*  HERE IS WHERE I NEED HELP*/func (g *Grid) SetRow(num, val int) {  row := g.Row(num)  rowLength := len(row)  for i := 0; i < rowLength; i++ {    tile := &row[i]    tile.contents = val  }}在某处似乎我需要指向我试图修改的实际瓷砖。事实上,该SetRow函数实际上并没有修改任何东西。我究竟做错了什么?请记住,我 2 天前才开始学习 Go,所以这是一次学习经历 :)
查看完整描述

1 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

实现目标的一种方法是在整个代码中使用指向磁贴的指针。将网格图块字段更改为:

tiles []*Tile

以及通过代码进行的一些相关更改。

此外,更改所有方法以使用指针接收器。问题中编写的 AddTile 方法在返回时丢弃对网格的修改。


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信