[英]Go change struct property values
http://openmymind.net/Things-I-Wish-Someone-Had-Told-Me-About-Go/
試圖繞過Go前進,這還是很新的。 我知道C中的引用和指針,但似乎無法在Go中使用它。 我已經閱讀了許多有關此問題的文章,但仍然無法真正理解和實施解決方案。
角色具有生命值和攻擊點。
字符可以Attack()。
戰斗回合調用Attack(),角色可以在該回合上攻擊。
意圖是,當在Character上調用Attack()時,將在另一個Character上更改運行狀況。
當前,健康永遠不會改變角色。
有人可以給我一個簡單的示例,說明如何以正確的方式更改對象的值嗎?
package main
import (
"fmt"
"math/rand"
"time"
)
//Character health + atk of
type Character struct {
Health, Atk int
}
//Attack ... Character can Attack
func (c *Character) Attack(health, atk int) {
health -= atk
}
//CharacterInterface ... methods for characters
type CharacterInterface interface {
Attack(health, atk int)
}
func combatRound(p, e Character) {
whoAtks := rand.Intn(100)
if whoAtks > 30 {
p.Attack(e.Health, p.Atk)
fmt.Println(p.Health)
} else {
e.Attack(p.Health, e.Atk)
fmt.Println(p.Health)
}
}
func main() {
//seed rand generator for the current run
rand.Seed(time.Now().UTC().UnixNano())
p := Character{20, 5}
e := Character{20, 5}
combatRound(p, e)
fmt.Println("Player Health: %d \n Enemy Health: %d", p.Health, e.Health)
}
在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
功能中,對於ot 100中的31個([ combatRound
間隔[ combatRound
]),平均而言,角色被顛倒或交換, enemy
(防御者)擊退player
(攻擊者)。 交換指針到Characters
反映了角色轉換。 而且玩家的生命值下降,而不是敵人的生命值下降。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.