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

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

不確定如何覆蓋回調來調整未導出的字段

不確定如何覆蓋回調來調整未導出的字段

Go
互換的青春 2023-07-10 14:26:00
我想做的是覆蓋給定對象上的一些布爾值,例如:func main() {? ? manager := dshardmanager.New("Bot " + token)? ? manager.bareSession.State.TrackRoles = false;? ? manager.bareSession.State.TrackPresences = false;? ? // more stuff happens down here}然而,這bareSession是一個未導出的字段,因此我需要以與我收集的方式不同的方式進行此操作。我遇到過一些使用反射的方法,但我想學習執行此操作的最佳實踐方法。在我的具體情況下,看起來我正在使用的庫提供了一種方法來完成此任務。我一直在研究如何覆蓋/定義這樣的方法,但似乎不知道如何解決這個問題。定義它SessionFunc()以按照我想要的方式自定義會話的理想方法是什么?
查看完整描述

2 回答

?
忽然笑

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

我不知道該庫的上下文,所以我不確定我在這里寫的內容對您是否有意義:)但是通過查看 API,SessionFunc是 a func(token string) (*discordgo.Session, error),即接收 astring并返回 a 的函數Session和一個error. 所以你可以做這樣的事情來覆蓋它:


func main() {

    manager := dshardmanager.New("Bot " + token)

    manager.SessionFunc = func(token string) (*discordgo.Session, error) {

        // use "token"


        // if invalid:

        if token == "" {

            // return an error

            return nil, fmt.Errorf("invalid token")

        }


        // otherwise, return a valid session

        return &discordgo.Session{}

    }


    // more stuff happens down here

}

該代碼顯然非常通用,但主要思想是您需要使用確切的標頭定義該函數并實現它。例如,我不知道如何評估令牌參數或創建discordgo.Session. 或者如何使用 來配置TrackRoles或值。這僅針對該庫,但我想這對你來說比對我更有意義:)TrackPresencesSessionFunc


您還可以在其他地方使用該確切的標頭定義常規函數:


func createNewSession(token string) (*discordgo.Session, error) {

    // use "token"


    // if invalid:

    if token == "" {

        // return an error

        return nil, fmt.Errorf("invalid token")

    }


    // otherwise, return a valid session

    return &discordgo.Session{}

}

并設置它:


func main() {

    manager := dshardmanager.New("Bot " + token)

    manager.SessionFunc = createNewSession


    // more stuff happens down here

}

兩種方法的工作原理相同。


反射[幾乎]從來都不是執行這些操作的推薦方法,如果庫創建者將這些屬性設為私有,則不應從外部更改/訪問它們。


查看完整回答
反對 回復 2023-07-10
?
子衿沉夜

TA貢獻1828條經驗 獲得超3個贊

這不會讓你改變bareSession。但如果您需要*discordgo.Session使用自定義參數派生新的參數,您可以執行類似于以下操作的操作。


func MySessionFunc(m *dshardmanager.Manager) dshardmanager.SessionFunc {

    return func(token string) (*discordgo.Session, error) {

        //Call default Session allocator

        s, err := m.StdSessionFunc(token)

        if err != nil {

            return nil, err

        }

        //Then, change its exported fields

        s.State.TrackRoles = false

        s.TrackPresences = false

        return s, nil

    }

}


func main() {

    manager := dshardmanager.New("Bot " + token)

    manager.SessionFunc = MySessionFunc(manager)

}


查看完整回答
反對 回復 2023-07-10
  • 2 回答
  • 0 關注
  • 136 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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