1 回答
TA贡献1869条经验 获得超4个赞
在 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
Assignment = ExpressionList assign_op ExpressionList .
assign_op = [ add_op | mul_op ] "=" .
每个左侧操作数必须是可寻址的、映射索引表达式或(仅用于 = 赋值)空白标识符。操作数可以用括号括起来。
元组赋值将多值操作的各个元素分配给变量列表。有两种形式。在第一种情况下,右侧操作数是单个多值表达式,例如函数调用、通道或映射操作或类型断言。左侧操作数的数量必须与值的数量相匹配。例如,如果 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函数中,对于 100 次(间隔 [0, 30] of [0, 100)) 的 31 次调用,平均而言,角色被颠倒或交换,enemy(防御者)击退player(攻击者)。交换指向 的指针Characters反映了角色互换。并且玩家的健康状况下降,而不是敌人的。
- 1 回答
- 0 关注
- 140 浏览
添加回答
举报