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

相关推荐
冷雨夜中漫步6 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
m0_736919108 小时前
C++代码风格检查工具
开发语言·c++·算法
2501_944934738 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
黎雁·泠崖9 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
2301_7634724610 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
TechWJ10 小时前
PyPTO编程范式深度解读:让NPU开发像写Python一样简单
开发语言·python·cann·pypto
lly20240610 小时前
C++ 文件和流
开发语言
m0_7066532310 小时前
分布式系统安全通信
开发语言·c++·算法
2501_9419820511 小时前
深度对比:Java、Go、Python 实现企微外部群推送,哪个效率更高?
java·golang·企业微信
寻寻觅觅☆11 小时前
东华OJ-基础题-104-A == B ?(C++)
开发语言·c++