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

相关推荐
WJ.Polar16 小时前
Java封装、继承、多态
java·开发语言
96245616 小时前
Go EVM 链上数据平台实践:从 RPC Demo 到可演进架构
rpc·架构·golang
摇滚侠16 小时前
Java 中如何表示负数,有符号和无符号的区别,补码的计算规则,char byte short int long 的范围
java·开发语言
weixin_3077791316 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab
爱读书的小胖16 小时前
Codewars:Rot13(C)解题分析
c语言·开发语言
鸽鸽程序猿17 小时前
【项目】【在线判题系统】b端题目增删改
开发语言·python
Lhappy嘻嘻17 小时前
读懂 JVM:内存模型、类加载机制、分代回收
java·开发语言·jvm
weixin_3077791318 小时前
C++代码实现MATLAB中的spectralcluster函数功能
开发语言·c++·算法·matlab
鸽鸽程序猿18 小时前
【项目】【在线判题系统】c端:竞赛报名
c语言·开发语言
Wang's Blog18 小时前
Java 项目实战: 交友项目 - 个人资料管理的需求分析与接口设计
java·开发语言·交友