面试题答案
一键面试- 定义新接口并保留旧接口:
- 定义新的
DataFetcherV2
接口,包含新增的方法。同时保留DataFetcher
接口,这样旧的实现仍然可以使用。
type DataFetcher interface { Fetch() ([]byte, error) } type DataFetcherV2 interface { DataFetcher Parse(data []byte) (interface{}, error) }
- 定义新的
- 修改依赖注入部分:
- 对于新代码:修改依赖
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)
- 对于新代码:修改依赖
通过以上方法,可以在保证向后兼容性的同时,合理更新依赖注入部分的代码以适应新接口。