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

相关推荐
techdashen14 小时前
Cloudflare 如何把一个大型代理拆成三个小服务来提升可靠性
开发语言·rust
geovindu14 小时前
go: Chain of Responsibility Pattern
开发语言·设计模式·golang·责任链模式
十五年专注C++开发14 小时前
WaitingSpinnerWidget: 一个高度可配置的自定义Qt等待加载动画组件
开发语言·c++·qt·waitingspinner
苍煜15 小时前
ThreadPoolExecutor线程池终极全解:同步异步判定+SpringBoot生产实战
java·开发语言·spring boot
fengfuyao98515 小时前
EWT(经验小波变换)MATLAB实现与应用
开发语言·matlab
MasonYyp19 小时前
基于Python可定制开发的智能体框架
开发语言·python
橘颂TA20 小时前
【Linux】读写锁
大数据·linux·开发语言·c++·读写锁
lv__pf20 小时前
集合框架1
java·开发语言
We་ct20 小时前
LeetCode 64. 最小路径和:动态规划入门实战
开发语言·前端·算法·leetcode·typescript·动态规划
CoderCodingNo20 小时前
【CSP】CSP-J 2019 江西真题 | 次大值 luogu-P5682 (适合GESP四、五级及以上考生练习)
开发语言·c++·算法