MST

星途 面试题库

面试题:Go函数与接口结合的依赖注入实现

假设你有一个服务接口 `UserService`,包含 `GetUser` 方法。有一个 `UserController` 结构体,其某个方法依赖于 `UserService` 接口。请通过函数与接口结合的方式,使用依赖注入的思想,实现 `UserController` 能够灵活切换不同的 `UserService` 实现,比如在测试环境和生产环境使用不同的实现。请写出关键代码逻辑并简要说明思路。
43.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

思路

  1. 定义 UserService 接口,包含 GetUser 方法。
  2. 定义 UserController 结构体,包含一个 UserService 类型的字段,用于实现依赖注入。
  3. UserService 接口创建不同的实现,比如生产环境和测试环境的实现。
  4. UserController 的方法中通过依赖注入的 UserService 实例调用 GetUser 方法。

关键代码逻辑

// 定义UserService接口
type UserService interface {
    GetUser() string
}

// 生产环境UserService实现
type ProductionUserService struct{}

func (p *ProductionUserService) GetUser() string {
    return "Production User"
}

// 测试环境UserService实现
type TestUserService struct{}

func (t *TestUserService) GetUser() string {
    return "Test User"
}

// 定义UserController结构体
type UserController struct {
    userService UserService
}

// UserController的方法,依赖UserService
func (uc *UserController) GetUserInfo() string {
    return uc.userService.GetUser()
}

使用示例

func main() {
    // 生产环境
    productionUC := &UserController{
        userService: &ProductionUserService{},
    }
    println(productionUC.GetUserInfo())

    // 测试环境
    testUC := &UserController{
        userService: &TestUserService{},
    }
    println(testUC.GetUserInfo())
}

在上述代码中,UserController 通过 userService 字段依赖 UserService 接口。在不同环境下,可以通过创建不同 UserService 实现的实例,并将其注入到 UserController 中来灵活切换实现。在 main 函数中展示了在生产环境和测试环境下的使用方式。