亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go,一流的功能和最佳實踐

Go,一流的功能和最佳實踐

Go
慕婉清6462132 2022-06-01 15:23:44
在過去的幾天里,我一直在解決一流函數問題的最佳方法(將可調用對象分配給某個變量)以及效率方面的最佳實踐方面遇到障礙。假設我正在編寫一個 Yugioh 紙牌游戲,我希望每張卡片類型的卡片至少具有以下屬性:type card struct {    name string    text string}我一直在努力思考在哪里(以及如何)對每張卡的單獨功能進行編程的想法。我目前確信一流函數的最佳位置是type card struct創建新屬性作為“可調用”,就像我在 Python 中那樣(Go playground 鏈接)。package mainimport "fmt"type card struct {    name string    text string    f interface{}}type monsterCard struct {    card    attack int    defense int}type buff func(target *monsterCard) // Could be defined in a second filetype swap func(target *monsterCard, value int) // dittovar increaseAttack buff = func(target *monsterCard)  { // ditto    target.attack += 100}var swichStats swap = func(target *monsterCard, value int) { // ditto    attack := target.attack    target.attack = value    target.defense = attack}func main()  {    m1 := monsterCard{        card:    card{            name: "Celtic Guardian",            f:    increaseAttack,        },        attack:  1400,        defense: 1200,    }    m2 := monsterCard{        card:    card{            name:     "Dark Magician",            f:         swichStats,        },        attack:  2500,        defense: 2100,    }    var monsters = [2]monsterCard{m1, m2}    for _, m := range monsters {        fmt.Println(m)        switch m.f.(type) {        case buff:            m.f.(buff)(&m)        case swap:            m.f.(swap)(&m, m.defense)        default:            fmt.Printf("%T", m.f)        }        fmt.Println(m)    }}我在高效代碼方面不是很好,我完全理解我可能會在這里提前優化;但是,我需要編寫數百個這樣的卡,如果這些可調用對象存在于全局范圍內并且嚴重依賴類型斷言會使程序變慢,那么我將在重新組織代碼時遇到麻煩。我的方法有什么明顯的問題嗎?我是否正確地使用了一流的功能,還是有一些我看不到的明顯性能問題?任何和所有的幫助將不勝感激!
查看完整描述

2 回答

?
富國滬深

TA貢獻1790條經驗 獲得超9個贊

您可以在需要時使用普通函數和閉包:


type card struct {

    name string

    text string

    fn   func(*monsterCard)

}


type monsterCard struct {

    card

    attack  int

    defense int

}


func (mc *monsterCard) call() {

    mc.fn(mc)

}


func increaseAttack(mc *monsterCard) {

    mc.attack += 100

}


func switchStats(mc *monsterCard) {

    mc.attack, mc.defense = mc.defense, mc.attack

}



func updateTextAndAttack(text string, attack int) func(mc *monsterCard) {

    return func(mc *monsterCard) {

        mc.text, mc.attack = text, attack

    }

}

https://play.golang.com/p/v_RbObnu7sN


您還可以在需要時使用普通方法和閉包:


type card struct {

    name string

    text string

}


type monsterCard struct {

    card

    attack  int

    defense int

}


func (mc *monsterCard) increaseAttack() {

    mc.attack += 100

}


func (mc *monsterCard) switchStats() {

    mc.attack, mc.defense = mc.defense, mc.attack

}


func (mc *monsterCard) updateTextAndAttack(text string, attack int) func() {

    return func() {

        mc.text, mc.attack = text, attack

    }

}

https://play.golang.com/p/Eo1mm-seldA


查看完整回答
反對 回復 2022-06-01
?
慕運維8079593

TA貢獻1876條經驗 獲得超5個贊

看來我仍在使用我的腳本語言思維方式來嘗試用編譯語言解決問題。與其嘗試創建最終導致代碼更難閱讀的接口,我需要更嚴格地自定義類型定義,并為每種類型的卡片效果實現不同的函數類型。如此嚴格的執行也將允許具有多種效果的卡牌存在于游戲中。


package main


type card struct {

    name string

    text string

}


type monsterCard struct {

    card

    attack int

    defense int

}


type buffEffect struct {

    monsterCard

    fn buff

}


type setValueEffect struct {

    monsterCard

    fn swap

}


type buff func(target *monsterCard)


type swap func(target *monsterCard, value int)


var increaseAttack buff = func(target *monsterCard)  {

    target.attack += 100

}


var setAttackValue swap = func(target *monsterCard, value int) {

    target.attack = value

}


func main()  {

    m1 := buffEffect{

        monsterCard: monsterCard{

            card:    card{

                name: "Celtic Guardian",

            },

            attack:  1400,

            defense: 1200,

        },

        fn:          increaseAttack,

    }

    m2 := setValueEffect{

        monsterCard: monsterCard{

            card:    card{

                name: "Dark Magician",

            },

            attack:  2500,

            defense: 2100,

        },

        fn:          setAttackValue,

    }

    m1.fn(&m1.monsterCard)

    m2.fn(&m2.monsterCard, 100)

}


查看完整回答
反對 回復 2022-06-01
  • 2 回答
  • 0 關注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號