http://openmymind.net/Things-I-Wish-Someone-Had-Told-Me-About-Go/
试着去了解Go,还是很新的。我知道C中的引用和指针,我似乎无法在Go中使用它。我已经阅读了很多关于这个问题的文章,但仍然没有真正理解和实施解决方案。
角色有健康和有效点。
Chars可以攻击()。
对抗围绕调用攻击(),角色可以攻击这一轮。
意图,当在Character上调用Attack()时,另一个角色的健康状况会发生变化。
目前健康状况从未在角色上发生变化。
有人能给我一个简明的例子,说明如何围绕RIGHT方式更改对象的值吗?
>>> [x for x in function(2)]
['AA', 'CA', 'TA', 'GA', 'AC', 'CC', 'TC', 'GC', 'AT', 'CT', 'TT', 'GT', 'AG', 'CG', 'TG', 'GG']
答案 0 :(得分:2)
在Go中,函数或方法调用的参数和接收器总是按值传递(通过赋值)。
例如,
package main
import (
"fmt"
"math/rand"
"time"
)
type Attacker interface {
Attacks(a *Character)
}
type Character struct {
Health, Attack int
}
func (c *Character) Attacks(a *Character) {
a.Health -= c.Attack
}
func combatRound(player, enemy *Character) {
if rand.Intn(100) <= 30 {
player, enemy = enemy, player
}
player.Attacks(enemy)
}
func main() {
rand.Seed(time.Now().UnixNano())
p := &Character{20, 5}
e := &Character{20, 5}
combatRound(p, e)
fmt.Printf("Player Health: %d\nEnemy Health: %d\n", p.Health, e.Health)
}
输出:
$ go run attack.go
Player Health: 20
Enemy Health: 15
$ go run attack.go
Player Health: 20
Enemy Health: 15
$ go run attack.go
Player Health: 15
Enemy Health: 20
The Go Programming Language Specification
Assignment = ExpressionList assign_op ExpressionList . assign_op = [ add_op | mul_op ] "=" .
每个左侧操作数必须是可寻址的,即地图索引 表达式,或(仅用于=赋值)空白标识符。操作数 可以用括号括起来。
元组赋值分配多值的各个元素 对变量列表的操作。有两种形式。在第一个, 右手操作数是一个单值多值表达式,如a 函数调用,通道或映射操作或类型断言。该 左侧操作数的数量必须与数量匹配 值。例如,如果f是一个返回两个值的函数,
x, y = f()
将第一个值分配给x,将第二个值分配给y。在第二种形式, 左边的操作数数量必须等于数量 右边的表达式,每个都必须是单值的,而且 右边的第n个表达式被赋值给第n个操作数 左:
one, two, three = '一', '二', '三'
转让分两个阶段进行。一,索引的操作数 表达式和指针间接(包括隐式指针) 左边的选择器中的间接和)上的表达式 权利都按照通常的顺序进行评估。第二,任务 按从左到右的顺序进行。
a, b = b, a // exchange a and b
Go语句
player, enemy = enemy, player
是元组赋值的第二种形式。它是交换或交换两个值的惯用方式。在分配发生之前,将评估左侧的操作数和右侧的表达式。编译器会为您处理任何临时变量。
在combatRound
函数中,对于31 out out 100([0,100] [0,100]个)调用,平均来说,角色被反转或交换,enemy
(后卫) )击退player
(攻击者)。将指针交换到Characters
反映了角色转换。并且玩家的健康状况下降,而不是敌人。