MST

星途 面试题库

面试题:Go语言中接口与事件驱动架构的结合应用

请阐述在Go语言中,如何通过接口来实现一个简单的事件驱动架构,例如模拟一个事件监听器和事件处理器的场景,需要给出关键代码示例。
16.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 定义事件接口

    type Event interface{}
    

    这里 Event 接口作为所有具体事件的基接口,实际应用中可以定义更具体的接口方法。

  2. 定义事件监听器接口

    type EventListener interface {
        OnEvent(event Event)
    }
    

    实现该接口的结构体将具备处理事件的能力。

  3. 定义事件处理器

    type EventHandler struct {
        listeners []EventListener
    }
    
    func (eh *EventHandler) AddListener(listener EventListener) {
        eh.listeners = append(eh.listeners, listener)
    }
    
    func (eh *EventHandler) RemoveListener(listener EventListener) {
        for i, l := range eh.listeners {
            if l == listener {
                eh.listeners = append(eh.listeners[:i], eh.listeners[i+1:]...)
                break
            }
        }
    }
    
    func (eh *EventHandler) FireEvent(event Event) {
        for _, listener := range eh.listeners {
            listener.OnEvent(event)
        }
    }
    

    EventHandler 结构体管理事件监听器列表,提供添加、移除监听器的方法,并能触发事件,让所有监听器处理该事件。

  4. 具体事件和监听器实现

    type ClickEvent struct{}
    
    type Button struct{}
    
    func (b *Button) OnEvent(event Event) {
        if _, ok := event.(ClickEvent); ok {
            println("Button clicked!")
        }
    }
    

    这里定义了一个 ClickEvent 事件和 Button 结构体,Button 实现了 EventListener 接口,处理 ClickEvent 事件。

  5. 使用示例

    func main() {
        eh := &EventHandler{}
        button := &Button{}
        eh.AddListener(button)
    
        eh.FireEvent(ClickEvent{})
    
        eh.RemoveListener(button)
        eh.FireEvent(ClickEvent{})
    }
    

    main 函数中,创建事件处理器,添加按钮监听器,触发点击事件,然后移除监听器并再次触发事件。此时第二次触发事件,按钮监听器已移除,不会再有响应。