Go基础(⑦实例和依赖注入)

依赖注入

不使用依赖注入(不推荐)

Go 复制代码
func (h *AdminHandler) Login(c *gin.Context) {
    // 每次都要自己创建服务
    adminService := service.NewAdminService()
    userService := service.NewUserService()
    taskService := service.NewTaskService()
    
    // 使用服务
    admin, err := adminService.AuthenticateAdmin(username, password)
    // ...
}

使用依赖注入(推荐)

Go 复制代码
// 1. 定义结构体,声明需要什么
type AdminHandler struct {
    adminService *service.AdminService
    userService  *service.UserService
    taskService  *service.TaskService
}

// 2. 创建时注入依赖
func NewAdminHandler() *AdminHandler {
    return &AdminHandler{
        adminService: service.NewAdminService(),  // 注入
        userService:  service.NewUserService(),   // 注入
        taskService:  service.NewTaskService(),   // 注入
    }
}

// 3. 使用时直接调用
func (h *AdminHandler) Login(c *gin.Context) {
    // 直接使用,不需要重新创建
    admin, err := h.adminService.AuthenticateAdmin(username, password)
    // ...
}

为什么用依赖注入?

问题1:重复创建

Go 复制代码
// 每个方法都要创建服务
func (h *AdminHandler) Login(c *gin.Context) {
    adminService := service.NewAdminService()  // 重复创建
    // ...
}

func (h *AdminHandler) CreateUser(c *gin.Context) {
    adminService := service.NewAdminService()  // 重复创建
    // ...
}

解决:依赖注入

Go 复制代码
// 只创建一次,所有方法共享
type AdminHandler struct {
    adminService *service.AdminService  // 只创建一次
}

func (h *AdminHandler) Login(c *gin.Context) {
    // 直接使用
    admin, err := h.adminService.AuthenticateAdmin(username, password)
}

func (h *AdminHandler) CreateUser(c *gin.Context) {
    // 直接使用
    user, err := h.adminService.CreateUser(username, password)
}

实例

对比其他语言

Go 复制代码
Go:     NewAdminHandler()
Java:   new AdminHandler()
C++:    new AdminHandler()
Python: AdminHandler()

实际例子

正确的命名

Go 复制代码
// 结构体
type AdminHandler struct {
    adminService *service.AdminService
}

// 构造函数
func NewAdminHandler() *AdminHandler {
    return &AdminHandler{
        adminService: service.NewAdminService(),
    }
}

// 使用
handler := NewAdminHandler()

错误的命名

Go 复制代码
// ❌ 错误:有空格
func New AdminHandler() *AdminHandler {
    // ...
}

// ❌ 错误:小写
func newAdminHandler() *AdminHandler {
    // ...
}

// ❌ 错误:其他命名
func CreateAdminHandler() *AdminHandler {
    // ...
}

123

相关推荐
知无不研27 分钟前
lambda表达式的使用(3)
开发语言·c++·lambda
cfm_29141 小时前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
C++ 老炮儿的技术栈2 小时前
基于Qt实现轻量化本地音乐播放器
开发语言·c++·qt·c·播放器·音乐
qq_448011162 小时前
C语言中的柔性数组
c语言·开发语言·柔性数组
小白学大数据2 小时前
长周期爬虫的数据一致性:断点续爬 + 事务回滚保障采集质量
开发语言·爬虫·测试工具
zlinear数据采集卡3 小时前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
Poo_Chai3 小时前
QT emit信号后完整处理流程,包括槽函数响应流程
java·开发语言·数据库
瑞码空间3 小时前
Java 图形界面(GUI)完整知识点手册
java·开发语言·图形界面·swing
小努蛋4 小时前
linux编译openresty异常问题,lua_cjson.c:706:5: 错误: ‘for‘ 循环初始化声明只在 C99 或 C++ 模式下允许
开发语言·lua·openresty
qz_Serene4 小时前
C++:类和对象(上)
开发语言·c++