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

深入理解 Go 的 init 函数:以 GORM 数据库连接为例

在 Go 语言中,init 函数是一个特殊的函数,它在程序启动时自动执行,用于初始化包级变量和执行一次性的设置。init 函数是自动执行的,不需要在代码中显式调用。本文将介绍 init 函数的作用,并以 GORM 数据库连接为例,展示如何在实际项目中使用 init 函数。

init 函数简介

每个包可以拥有多个 init 函数,它们在程序启动时按文件顺序执行。init 函数没有参数,也没有返回值。它们通常用于以下目的:

  • 初始化包级变量。
  • 建立数据库连接。
  • 执行必要的设置或配置。
  • 执行一次性的资源分配。

使用 init 函数建立 GORM 数据库连接

以 GORM 为例,我们可以在 init 函数中建立数据库连接,并将其存储在包级变量中,以便在程序的其他地方使用。

定义数据库连接

首先,我们定义一个包级变量 DB 用于存储数据库连接:

var DB *gorm.DB

初始化数据库连接

接下来,在 init 函数中,我们使用 GORM 建立数据库连接:

func init() {// 数据库配置信息username := "root"password := "12345678"host := "127.0.0.1"port := 3306dbname := "gorm"timeout := "10s"// 创建数据源名称(DSN)dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&timeout=%s", username, password, host, port, dbname, timeout)// 配置 GORMconfig := &gorm.Config{SkipDefaultTransaction: true,NamingStrategy: schema.NamingStrategy{TablePrefix:   "f_",  // 表名前缀SingularTable: true,  // 单数表名NoLowerCase:   false, // 关闭大小写转换},}// 打开数据库连接db, err := gorm.Open(mysql.Open(dsn), config)if err != nil {panic("连接数据库失败,error=" + err.Error())}// 打印数据库连接状态fmt.Printf("数据库连接状态: %v\n", db)// 将数据库连接赋值给包级变量DB = db
}

使用数据库连接

main 函数或其他函数中,我们可以直接使用 DB 变量进行数据库操作:

func main() {// 使用 Debug 模式自动迁移 Student 表DB.Debug().AutoMigrate(&Student{})
}

结语

通过使用 init 函数,我们可以在程序启动时自动执行必要的初始化操作,如建立数据库连接。这种方式有助于保持代码的整洁和组织性,同时确保了初始化逻辑的执行。GORM 的 AutoMigrate 方法进一步简化了数据库迁移的过程,使得开发更加高效。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • [SWPUCTF 2021 新生赛]include
  • Arrays类、Random类和包装类(8大基本数据类型)的用法
  • 加密软件有哪些常见的安全特性
  • Linux驱动开发—设备树分析:GPIO,中断,时钟信息,CPU信息
  • Postgresql数据库中通过函数实现将不确定列的数据插入到表中
  • c++中std::endl 和“\n“ 这两个换行符有什么区别
  • uniapp——列表图片加载太多且空间占用太大的处理方法(降低清晰度)
  • git的基本操作和原理
  • MoE-LLaVA: Mixture of Experts for Large Vision-Language Models
  • Elastic Observability 8.15:AI 助手、OTel 和日志质量增强功能
  • Filebeat+Kafka+ELK
  • RabbitMQ再回首--往事如梦
  • 代码随想录算法训练营第45天|LeetCode 115.不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • Netty技术全解析:DelimiterBasedFrameDecoder类深度解析
  • MySQL增删改查(基础)
  • ES6指北【2】—— 箭头函数
  • 《剑指offer》分解让复杂问题更简单
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • Android 控件背景颜色处理
  • css布局,左右固定中间自适应实现
  • JDK 6和JDK 7中的substring()方法
  • npx命令介绍
  • PhantomJS 安装
  • react-native 安卓真机环境搭建
  • Theano - 导数
  • 初识MongoDB分片
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 我建了一个叫Hello World的项目
  • 携程小程序初体验
  • 原生Ajax
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​马来语翻译中文去哪比较好?
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • #07【面试问题整理】嵌入式软件工程师
  • #Ubuntu(修改root信息)
  • (2)nginx 安装、启停
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (二十六)Java 数据结构
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (十) 初识 Docker file
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)一些感悟
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET WPF 抖动动画
  • .NET 设计模式初探
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .net程序集学习心得
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • [ C++ ] 继承