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

我想做的是覆盖给定对象上的一些布尔值,例如:


func main() {

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

    manager.bareSession.State.TrackRoles = false;

    manager.bareSession.State.TrackPresences = false;


    // more stuff happens down here

}

然而,这bareSession是一个未导出的字段,因此我需要以与我收集的方式不同的方式进行此操作。我遇到过一些使用反射的方法,但我想学习执行此操作的最佳实践方法。

在我的具体情况下,看起来我正在使用的库提供了一种方法来完成此任务。我一直在研究如何覆盖/定义这样的方法,但似乎不知道如何解决这个问题。

定义它SessionFunc()以按照我想要的方式自定义会话的理想方法是什么?


互换的青春
浏览 108回答 2
2回答

忽然笑

我不知道该库的上下文,所以我不确定我在这里写的内容对您是否有意义:)但是通过查看 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}两种方法的工作原理相同。反射[几乎]从来都不是执行这些操作的推荐方法,如果库创建者将这些属性设为私有,则不应从外部更改/访问它们。

子衿沉夜

这不会让你改变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)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go