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

时间:2016-02-05 04:47:30

标签: go

我有以下代码,如果您愿意,请随时提供指示:

package main

import (
  "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
  }
}

在某个地方,我似乎需要制作一个指向我正在尝试修改的实际Tiles的指针。因为SetRow函数实际上并没有修改任何东西。我究竟做错了什么?请记住,我刚开始学习Go 2天前,所以这是一次学习经历:)

1 个答案:

答案 0 :(得分:1)

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

<camel:camelContext>
        <camel:dataFormats>
            <!-- path to jaxb annotated class -->
            <camel:jaxb id="invoiceJaxb" contextPath="com.java.bean"
                prettyPrint="true" />
        </camel:dataFormats>
        <camel:route>
            <camel:from uri="direct:invoice" />
            <camel:marshal ref="invoiceJaxb" />
            <camel:log message=" ${body}" />
            <camel:to uri="file://src/resources?fileName=One.xml"/>
        </camel:route>
    </camel:camelContext>

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

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

playground example