当前位置: 首页 > news >正文

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

依赖注入

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

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

使用依赖注入(推荐)

// 1. 定义结构体,声明需要什么
type AdminHandler struct {adminService *service.AdminServiceuserService  *service.UserServicetaskService  *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:重复创建

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

解决:依赖注入

// 只创建一次,所有方法共享
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:     NewAdminHandler()
Java:   new AdminHandler()
C++:    new AdminHandler()
Python: AdminHandler()

实际例子

正确的命名

// 结构体
type AdminHandler struct {adminService *service.AdminService
}// 构造函数
func NewAdminHandler() *AdminHandler {return &AdminHandler{adminService: service.NewAdminService(),}
}// 使用
handler := NewAdminHandler()

错误的命名

// ❌ 错误:有空格
func New AdminHandler() *AdminHandler {// ...
}// ❌ 错误:小写
func newAdminHandler() *AdminHandler {// ...
}// ❌ 错误:其他命名
func CreateAdminHandler() *AdminHandler {// ...
}

123

http://www.dtcms.com/a/423507.html

相关文章:

  • 网站建设绩效考核方案ppt网页开发背景与意义
  • 【数据结构】基础知识
  • Fluttercon EU 2025 :Let‘s go far with Flutter
  • go-commons/stringutils 与标准库 strings 对比
  • 长春网站推广方式seo综合查询国产
  • 探索3D空间的视觉基础模型系列
  • 自建营销型企业网站怎么建设公益网站
  • C# 基于halcon的视觉工作流-章40-OCR训练识别
  • OCR API-智能文字识别技术,从“手动录入”到“智慧识别”的跨越
  • 收到网站代码后怎么做设计素材模板
  • JWT (JSON Web Token) 综合指南
  • 【笔记】在WPF中Binding里的详细功能介绍
  • html 滚动条相关开发经验总结
  • C++基础:(六) 内存管理深度解析:从分布到实现
  • BUUCTF get_started_3dsctf_2016 wp
  • 成都网站制作设计网页设计实训报告心得体会
  • Linux 进程创建与控制详解
  • 万网x3主机l系统放两个网站手机制作ppt
  • XML语言解析
  • AJAX XML:深入解析与实际应用
  • 十大网站在线观看深圳互联网推广公司
  • 价值流智能时代:DevOps平台如何成为企业高效交付的核心引擎?
  • Vue Router 动态路由完全指南:灵活掌控前端路由
  • 电子商务网站域名注册方法wordpress 模板语言包
  • 网站空间和服务器有什么区别阜宁网站制作价格
  • 【每日一问】X电容和Y电容有什么区别?
  • AI 播客:从体验到原理,知识获取的新姿势
  • 异构计算实战:CPU/GPU/TPU在创意工作流中的调度策略
  • 打破“形似”桎梏,OmniHuman-1.5让数字人“由内而外”活起来。
  • 语言理解-阿里木江【基础课笔记】