去改变struct属性值

时间:2016-02-13 22:34:42

标签: go

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']

1 个答案:

答案 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

     

Assignments

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反映了角色转换。并且玩家的健康状况下降,而不是敌人。