代码之家  ›  专栏  ›  技术社区  ›  Ben

我怎样才能在golang覆盖这个回调

  •  0
  • Ben  · 技术社区  · 5 年前

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

    func main() {
        manager := dshardmanager.New("Bot " + token)
        manager.bareSession.State.TrackRoles = false;
        manager.bareSession.State.TrackPresences = false;
    
        // more stuff happens down here
    }
    

    bareSession 是一个未报道的领域,所以我需要做的不同于我收集。我遇到过一些使用反射的方法,但我想学习 最佳实践

    在我的特殊情况下,看起来 library I'm using offers a method to accomplish this . 我一直在修补如何覆盖/定义这样一个方法,但似乎不知道该怎么做。

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

    0 回复  |  直到 5 年前
        1
  •  1
  •   cd1    5 年前

    我不知道这个库的上下文,所以我不确定我在这里写的内容是否对您有意义:)但是通过查看API, SessionFunc 是一个 func(token string) (*discordgo.Session, error) ,即接收 string 返回一个 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 TrackPresences 会话函数

    您也可以在其他地方定义一个具有确切标头的正则函数:

    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
    }
    

    反射[几乎]从来不是做这些事情的推荐方法,如果库创建者将这些属性设置为私有,则不应该从外部更改/访问它们。

        2
  •  0
  •   Giulio Micheloni    5 年前

    这不允许你改变 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)
    }