簡體   English   中英

更改結構屬性值

[英]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

Go編程語言規范

分配

 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM