MST

星途 面试题库

面试题:Go语言接口新增方法对依赖注入的影响

在Go语言中,使用接口进行依赖注入是常见做法。当一个接口发生演化,增加了新的方法,例如原 `DataFetcher` 接口只有 `Fetch` 方法,现在新增 `Parse` 方法。在一个依赖 `DataFetcher` 接口的复杂业务逻辑代码中,如何在保证向后兼容性的同时,合理更新依赖注入部分的代码,以适应新接口?
19.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 定义新接口并保留旧接口
    • 定义新的 DataFetcherV2 接口,包含新增的方法。同时保留 DataFetcher 接口,这样旧的实现仍然可以使用。
    type DataFetcher interface {
        Fetch() ([]byte, error)
    }
    type DataFetcherV2 interface {
        DataFetcher
        Parse(data []byte) (interface{}, error)
    }
    
  2. 修改依赖注入部分
    • 对于新代码:修改依赖 DataFetcher 接口的业务逻辑代码,使其接受 DataFetcherV2 接口,如果可能的话。
    func complexBusinessLogic(fetcher DataFetcherV2) {
        data, err := fetcher.Fetch()
        if err!= nil {
            // 处理错误
        }
        result, err := fetcher.Parse(data)
        if err!= nil {
            // 处理错误
        }
        // 继续业务逻辑
    }
    
    • 对于旧代码兼容性:为了保证向后兼容性,创建一个适配层。如果旧的实现只实现了 DataFetcher 接口,我们可以创建一个包装类型,使其适配 DataFetcherV2 接口。
    type LegacyDataFetcherAdapter struct {
        LegacyFetcher DataFetcher
    }
    func (lfa LegacyDataFetcherAdapter) Fetch() ([]byte, error) {
        return lfa.LegacyFetcher.Fetch()
    }
    func (lfa LegacyDataFetcherAdapter) Parse(data []byte) (interface{}, error) {
        // 这里可以返回错误,因为旧实现没有Parse功能,也可以根据业务需要提供默认实现
        return nil, fmt.Errorf("Parse not implemented in legacy fetcher")
    }
    
    • 在使用旧实现的地方,可以将其包装成 LegacyDataFetcherAdapter 后传递给需要 DataFetcherV2 接口的业务逻辑。
    legacyFetcher := &LegacyDataFetcher{}
    adapter := LegacyDataFetcherAdapter{LegacyFetcher: legacyFetcher}
    complexBusinessLogic(adapter)
    

通过以上方法,可以在保证向后兼容性的同时,合理更新依赖注入部分的代码以适应新接口。