为了账号安全,请及时绑定邮箱和手机立即绑定

不确定如何覆盖回调来调整未导出的字段

不确定如何覆盖回调来调整未导出的字段

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 关注
  • 106 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信