Indirectly change a value in a struct in Go

huangapple go评论72阅读模式
英文:

Indirectly change a value in a struct in 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
}

/*
  这里是我需要帮助的地方
*/
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语言。我遇到的问题是在这里:

/*
  这里是我需要帮助的地方
*/
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
	}
}

在某个地方,似乎我需要创建一个指向我要修改的实际Tile的指针。目前,SetRow函数实际上没有修改任何内容。我做错了什么?请记住,我只是两天前开始学习Go语言,所以这是一个学习经验 Indirectly change a value in a struct in Go

英文:

I have the following code, feel free to offer pointers if you wish:

package main
import (
&quot;fmt&quot;
)
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 &lt; 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 &lt; rowLength; i++ {
tile := &amp;row[i]
tile.contents = val
}
}
func (g Grid) Col(num int) []Tile {
numTiles := len(g.tiles)
col := []Tile{}
for i := 0; i &lt; 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 &lt;= rows; r++ {
for c := 1; c &lt;= 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))
}

I am doing this, more than anything, as a simple project to help me learn Go. The problem that is have run in to is here

/*
HERE IS WHERE I NEED HELP
*/
func (g *Grid) SetRow(num, val int) {
row := g.Row(num)
rowLength := len(row)
for i := 0; i &lt; rowLength; i++ {
tile := &amp;row[i]
tile.contents = val
}
}

Somewhere it seems like I need to be making a pointer to the actual Tiles that I'm trying to modify. As it is the SetRow function doesn't actually modify anything. What am I doing wrong? Keep in mind I just started learning Go 2 days ago, so this is a learning experience Indirectly change a value in a struct in Go

答案1

得分: 1

实现你的目标的一种方法是在代码中使用指向瓦片的指针。将Grid的tiles字段更改为:

tiles []*Tile

并在代码中进行一些相关的更改。

此外,将所有的方法都改为使用指针接收器。在问题中给出的AddTile方法在返回时丢弃了对网格的修改。

playground示例

英文:

One way to accomplish your goal is to use pointers to tiles throughout the code. Change the Grid tiles field to:

tiles []*Tile

and several related changes through the code.

Also, change all the methods to use pointer receivers. The AddTile method as written in the question discards the modification to the grid on return.

playground example

huangapple
  • 本文由 发表于 2016年2月5日 12:47:29
  • 转载请务必保留本文链接:https://go.coder-hub.com/35216457.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定