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

Go语言 GORM框架 使用指南

在 Go 语言社区中,数据库交互一直是开发者们关注的重点领域,不同开发者基于自身的需求和偏好,形成了两种主要的技术选型流派。一部分开发者钟情于像sqlx这类简洁的库,尽管其功能并非一应俱全,但它赋予开发者对 SQL 语句的绝对控制权,便于开发者将性能优化到极致,从而满足对性能有严苛要求的场景。与之相对的另一部分开发者,则更倾向于为提升开发效率而生的 ORM(对象关系映射)框架。借助 ORM,开发者能够省去诸多繁琐的数据库操作细节,极大地加速开发进程。

在 Go 语言的 ORM 领域,gorm无疑占据着举足轻重的地位,作为一款历史悠久且成熟的 ORM 框架,深受广大开发者的喜爱。与gorm类似的,还有相对年轻的xorment等框架,它们各自凭借独特的优势,在 Go 语言社区中也拥有着一批忠实的用户。

本文聚焦于gorm框架,主要为大家介绍其基础入门知识,希望能为读者开启探索gorm世界的大门。若想深入了解gorm的更多细节,推荐阅读官方文档,其完善的中文文档为开发者提供了详尽的学习资料。

  • 官方文档:GORM - The fantastic ORM library for Golang, aims to be developer friendly.
  • 开源仓库:go-gorm/gorm: The fantastic ORM library for Golang, aims to be developer friendly (github.com)

特点

  1. 全功能 ORM:涵盖了丰富的数据库操作功能,为开发者提供一站式解决方案。
  2. 关联关系支持:全面支持多种关联关系,如拥有一个(Has One)、拥有多个(Has Many)、属于(Belongs To)、多对多(Many To Many)、多态(Polymorphism)以及单表继承(Single-table inheritance),满足复杂业务场景下的数据关系建模需求。
  3. 钩子方法:在 Create、Save、Update、Delete、Find 等操作中均提供了钩子方法,方便开发者在数据库操作前后进行自定义逻辑处理。
  4. 预加载功能:支持PreloadJoins的预加载方式,有效减少数据库查询次数,提升数据获取效率。
  5. 事务管理:提供完善的事务管理机制,包括事务、嵌套事务、Save Point 以及 Rollback To Saved Point 等功能,确保数据操作的原子性和一致性。
  6. 多种模式支持:支持 Context、预编译模式(Prepared Statement Mode)和 DryRun 模式,为开发者提供更多的灵活性和调试便利性。
  7. 高效的数据操作:具备批量插入、FindInBatches、Find/Create with Map 等功能,并且支持使用 SQL 表达式、Context Valuer 进行 CRUD 操作,满足不同场景下的数据操作需求。
  8. 强大的 SQL 构建能力:拥有 SQL 构建器,支持 Upsert、锁机制、Optimizer/Index/Comment Hint、命名参数以及子查询等高级 SQL 特性,让开发者能够灵活构建复杂的 SQL 语句。
  9. 数据库结构管理:支持复合主键、索引和约束的创建与管理,同时提供自动迁移功能,能够根据定义的结构体自动同步数据库表结构,减少手动维护数据库结构的工作量。
  10. 自定义日志:允许开发者自定义 Logger,方便记录和跟踪数据库操作日志,便于排查问题和进行性能分析。
  11. 灵活的插件扩展:提供灵活可扩展的插件 API,例如 Database Resolver(支持多数据库、读写分离)、Prometheus 等插件,满足不同业务场景下的扩展需求。
  12. 严格的测试保障:每个特性都经过了严格的测试,确保框架的稳定性和可靠性。
  13. 开发者友好:设计理念注重开发者体验,提供简洁易懂的 API 和丰富的文档,降低开发者的学习成本。

当然,gorm并非完美无缺。例如,其几乎所有方法的参数都采用空接口类型,这使得参数的传递方式较为模糊,若不查阅文档,开发者很难明确在不同场景下应传递何种参数,有时可传递结构体,有时是字符串、map 或切片。此外,在许多情况下,开发者仍需自行编写 SQL 语句来满足复杂的业务需求。

其中,gorm作为 Go 生态中历史悠久的 ORM 框架,凭借其全面的功能支持和良好的社区活跃度,成为众多项目的首选。本文将围绕gorm展开基础入门介绍,旨在帮助快速上手。

安装

$ go get -u gorm.io/gorm

gorm 目前支持以下几种数据库

  • MySQL :"gorm.io/driver/mysql"
  • PostgreSQL: "gorm.io/driver/postgres"
  • SQLite:"gorm.io/driver/sqlite"
  • SQL Server:"gorm.io/driver/sqlserver"
  • TIDB:"gorm.io/driver/mysql",TIDB 兼容 mysql 协议
  • ClickHouse:"gorm.io/driver/clickhouse"

本文接下来将使用 MySQL 来进行演示,使用的什么数据库,就需要安装什么驱动,这里安装 Mysql 的 gorm 驱动。

$ go get -u gorm.io/driver/mysql  # 以MySQL为例

然后使用 dsn(data source name)连接到数据库,驱动库会自行将 dsn 解析为对应的配置

package mainimport ("gorm.io/driver/mysql""gorm.io/gorm""log/slog"
)func main() {dsn := "root:123456@tcp(192.168.48.138:3306)/hello?charset=utf8mb4&parseTime=True&loc=Local"db, err := gorm.Open(mysql.Open(dsn))if err != nil {slog.Error("db connect error", err)}slog.Info("db connect success")
}

或者手动传入配置

package mainimport ("gorm.io/driver/mysql""gorm.io/gorm""log/slog"
)func main() {db, err := gorm.Open(mysql.New(mysql.Config{}))if err != nil {slog.Error("db connect error", err)}slog.Info("db connect success")
}

两种方法都是等价的,看自己使用习惯。

连接配置

通过传入gorm.Config配置结构体,我们可以控制 gorm 的一些行为

db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

模型

gorm.Model

为了方便模型定义,GORM内置了一个gorm.Model结构体。gorm.Model是一个包含了ID, CreatedAt, UpdatedAt, DeletedAt四个字段的Golang结构体。

// gorm.Model 定义
type Model struct {ID        uint `gorm:"primary_key"`CreatedAt time.TimeUpdatedAt time.TimeDeletedAt *time.Time
}

你可以将它嵌入到你自己的模型中:

// 将 `ID`, `CreatedAt`, `UpdatedAt`, `DeletedAt`字段注入到`User`模型中
type User struct {gorm.Model // 内嵌gorm.Model,包含ID, CreatedAt, UpdatedAt, DeletedAt字段    Name      string `gorm:"type:varchar(100);not null"`Email     string `gorm:"type:varchar(100);uniqueIndex"`Age       int    `gorm:"default:18"`IsActive  bool   `gorm:"default:true"`
}

当然你也可以完全自己定义模型:

// 不使用gorm.Model,自行定义模型
type User struct {ID   intName string
}

结构体标记(tags)

使用结构体声明模型时,标记(tags)是可选项。gorm支持以下标记:

支持的结构体标记(Struct tags)

结构体标记(Tag)描述
Column指定列名
Type指定列数据类型
Size指定列大小, 默认值255
PRIMARY_KEY将列指定为主键
UNIQUE将列指定为唯一
DEFAULT指定列默认值
PRECISION指定列精度
NOT NULL将列指定为非 NULL
AUTO_INCREMENT指定列是否为自增类型
INDEX创建具有或不带名称的索引, 如果多个索引同名则创建复合索引
UNIQUE_INDEXINDEX 类似,只不过创建的是唯一索引
EMBEDDED将结构设置为嵌入
EMBEDDED_PREFIX设置嵌入结构的前缀
-忽略此字段

关联相关标记(tags)

结构体标记(Tag)描述
MANY2MANY指定连接表
FOREIGNKEY设置外键
ASSOCIATION_FOREIGNKEY设置关联外键
POLYMORPHIC指定多态类型
POLYMORPHIC_VALUE指定多态值
JOINTABLE_FOREIGNKEY指定连接表的外键
ASSOCIATION_JOINTABLE_FOREIGNKEY指定连接表的关联外键
SAVE_ASSOCIATIONS是否自动完成 save 的相关操作
ASSOCIATION_AUTOUPDATE是否自动完成 update 的相关操作
ASSOCIATION_AUTOCREATE是否自动完成 create 的相关操作
ASSOCIATION_SAVE_REFERENCE是否自动完成引用的 save 的相关操作
PRELOAD是否自动完成预加载的相关操作

主键、表名、列名的约定

主键(Primary Key)

GORM 默认会使用名为ID的字段作为表的主键。

type User struct {ID   string // 名为`ID`的字段会默认作为表的主键Name string
}// 使用`AnimalID`作为主键
type Animal struct {AnimalID int64 `gorm:"primary_key"`Name     stringAge      int64
}

表名(Table Name)

表名默认就是结构体名称的复数,例如:

type User struct {} // 默认表名是 `users`// 将 User 的表名设置为 `profiles`
func (User) TableName() string {return "profiles"
}func (u User) TableName() string {if u.Role == "admin" {return "admin_users"} else {return "users"}
}// 禁用默认表名的复数形式,如果置为 true,则 `User` 的默认表名是 `user`
db.SingularTable(true)

也可以通过Table()指定表名:

// 使用User结构体创建名为`deleted_users`的表
db.Table("deleted_users").CreateTable(&User{})var deleted_users []User
db.Table("deleted_users").Find(&deleted_users)
 SELECT * FROM deleted_users;db.Table("deleted_users").Where("name = ?", "jinzhu").Delete()
 DELETE FROM deleted_users WHERE name = 'jinzhu';

GORM还支持更改默认表名称规则:

gorm.DefaultTableNameHandler = func (db *gorm.DB, defaultTableName string) string  {return "prefix_" + defaultTableName;
}

列名(Column Name)

列名由字段名称进行下划线分割来生成

type User struct {ID        uint      // column name is `id`Name      string    // column name is `name`Birthday  time.Time // column name is `birthday`CreatedAt time.Time // column name is `created_at`
}

可以使用结构体tag指定列名:

type Animal struct {AnimalId    int64     `gorm:"column:beast_id"`         // set column name to `beast_id`Birthday    time.Time `gorm:"column:day_of_the_beast"` // set column name to `day_of_the_beast`Age         int64     `gorm:"column:age_of_the_beast"` // set column name to `age_of_the_beast`
}

时间戳跟踪

CreatedAt

如果模型有 CreatedAt字段,该字段的值将会是初次创建记录的时间。

db.Create(&user) // `CreatedAt`将会是当前时间// 可以使用`Update`方法来改变`CreateAt`的值
db.Model(&user).Update("CreatedAt", time.Now())

UpdatedAt

如果模型有UpdatedAt字段,该字段的值将会是每次更新记录的时间。

db.Save(&user) // `UpdatedAt`将会是当前时间db.Model(&user).Update("name", "jinzhu") // `UpdatedAt`将会是当前时间

DeletedAt

如果模型有DeletedAt字段,调用Delete删除该记录时,将会设置DeletedAt字段为当前时间,而不是直接将记录从数据库中删除。

CRUD接口

简单的列举了,创建、查询、修改、删除的使用,详情可以看官方文档。

创建 (Create)

// 创建单个记录
user := User{Name: "张三", Age: 20}
result := db.Create(&user) 
// 执行SQL: INSERT INTO users (name, age) VALUES ('张三', 20);// 批量创建
users := []User{{Name: "李四", Age: 22},{Name: "王五", Age: 23},
}
db.Create(&users)
// 执行SQL: INSERT INTO users (name, age) VALUES ('李四', 22), ('王五', 23);

查询 (Read)

单条查询

var user User
db.First(&user)
// 执行SQL: SELECT * FROM users ORDER BY id LIMIT 1;db.Where("name = ?", "张三").First(&user)
// 执行SQL: SELECT * FROM users WHERE name = '张三' ORDER BY id LIMIT 1;db.First(&user, 10)
// 执行SQL: SELECT * FROM users WHERE id = 10;

多条查询

var users []User
db.Where("age > ?", 20).Find(&users)
// 执行SQL: SELECT * FROM users WHERE age > 20;db.Where(map[string]interface{}{"name": "张三", "age": 20}).Find(&users)
// 执行SQL: SELECT * FROM users WHERE name = '张三' AND age = 20;

高级查询

db.Select("name", "age").Find(&users)
// 执行SQL: SELECT name, age FROM users;db.Order("age desc").Find(&users)
// 执行SQL: SELECT * FROM users ORDER BY age DESC;db.Limit(10).Offset(5).Find(&users)
// 执行SQL: SELECT * FROM users LIMIT 10 OFFSET 5;var count int64
db.Model(&User{}).Where("age > ?", 20).Count(&count)
// 执行SQL: SELECT COUNT(*) FROM users WHERE age > 20;

更新 (Update)

db.Save(&user)
// 执行SQL: UPDATE users SET name='张三', age=20 WHERE id=1;db.Model(&user).Update("name", "李四")
// 执行SQL: UPDATE users SET name='李四' WHERE id=1;db.Model(&user).Updates(User{Name: "李四", Age: 21})
// 执行SQL: UPDATE users SET name='李四', age=21 WHERE id=1;db.Model(&User{}).Where("age < ?", 20).Update("name", "未成年人")
// 执行SQL: UPDATE users SET name='未成年人' WHERE age < 20;

删除 (Delete)

db.Delete(&user)
// 执行SQL: DELETE FROM users WHERE id=1;db.Delete(&User{}, 10)
// 执行SQL: DELETE FROM users WHERE id=10;db.Where("age < ?", 20).Delete(&User{})
// 执行SQL: DELETE FROM users WHERE age < 20;

事务

自动事务

db.Transaction(func(tx *gorm.DB) error {if err := tx.Create(&user1).Error; err != nil {return err}// 执行SQL: INSERT INTO users (name, age) VALUES ('user1', 20);if err := tx.Create(&user2).Error; err != nil {return err}// 执行SQL: INSERT INTO users (name, age) VALUES ('user2', 22);return nil
})
// 如果成功执行SQL: COMMIT;
// 如果失败执行SQL: ROLLBACK;

手动事务

tx := db.Begin()
// 执行SQL: BEGIN;tx.Create(&user1)
// 执行SQL: INSERT INTO users (name, age) VALUES ('user1', 20);tx.Create(&user2)
// 执行SQL: INSERT INTO users (name, age) VALUES ('user2', 22);tx.Commit()
// 执行SQL: COMMIT;// 或者出错时
tx.Rollback()
// 执行SQL: ROLLBACK;

嵌套事务

db.Transaction(func(tx *gorm.DB) error {tx.Create(&user1)// 执行SQL: INSERT INTO users (name, age) VALUES ('user1', 20);tx.Transaction(func(tx2 *gorm.DB) error {tx2.Create(&user2)// 执行SQL: SAVEPOINT sp1;// 执行SQL: INSERT INTO users (name, age) VALUES ('user2', 22);return errors.New("inner error")// 执行SQL: ROLLBACK TO sp1;})return nil// 执行SQL: COMMIT;
})

保存点 (SavePoint)

tx := db.Begin()
// 执行SQL: BEGIN;tx.Create(&user1)
// 执行SQL: INSERT INTO users (name, age) VALUES ('user1', 20);tx.SavePoint("sp1")
// 执行SQL: SAVEPOINT sp1;tx.Create(&user2)
// 执行SQL: INSERT INTO users (name, age) VALUES ('user2', 22);tx.RollbackTo("sp1")
// 执行SQL: ROLLBACK TO sp1;tx.Commit()
// 执行SQL: COMMIT;

参考资料

GORM 指南

Golang 中文学习文档 - 第三方库 - GORM

李文周的博客 - GORM入门指南

李文周的博客 - GORM CRUD指南

相关文章:

Go语言 GORM框架 使用指南

在 Go 语言社区中&#xff0c;数据库交互一直是开发者们关注的重点领域&#xff0c;不同开发者基于自身的需求和偏好&#xff0c;形成了两种主要的技术选型流派。一部分开发者钟情于像sqlx这类简洁的库&#xff0c;尽管其功能并非一应俱全&#xff0c;但它赋予开发者对 SQL 语句…...

c#车检车构客户管理系统软件车辆年审短信提醒软件

# CMS_VehicleInspection 车检车构客户管理系统软件车辆年审短信提醒软件 # 开发背景 软件是给泸州某公司开发的车检车构客户管理系统软件。用于在车检年审到期前一个月给客户发送车检短信提醒 # 功能描述 主要功能&#xff1a;车辆年审前一个月给客户发年审短信提醒&#xf…...

匿名函数与闭包(Anonymous Functions and Closures)-《Go语言实战指南》原创

Go 支持将函数当作值来使用&#xff0c;也允许定义匿名函数&#xff0c;并通过闭包实现对外部变量的捕获与持续访问。这一特性使函数式编程风格在 Go 中成为可能。 一、什么是匿名函数&#xff1f; 匿名函数是没有名字的函数&#xff0c;可以定义后立即调用&#xff0c;或赋值…...

兰亭妙微:用系统化思维重构智能座舱 UI 体验

兰亭妙微设计专注于以产品逻辑驱动的界面体验优化&#xff0c;服务领域覆盖AI交互、智能穿戴、IoT设备、智慧出行等多个技术密集型产业。我们倡导以“系统性设计”为方法论&#xff0c;在用户需求与技术边界之间找到最优解。 此次智能驾驶项目&#xff0c;我们为某车载平台提供…...

Flowbite 和 daisyUI 那个好用?

Flowbite 和 daisyUI 都是基于 Tailwind CSS 的组件库&#xff0c;它们各有特色&#xff0c;选哪个更好用&#xff0c;取决于你的项目需求和设计偏好。 简要结论 对比项daisyUIFlowbite上手难度简单&#xff0c;类名即组件略复杂&#xff08;多用 HTML 结构&#xff09;Vue 支…...

中间网络工程师知识点5

1.PKI证书主要用于确保主体公钥的合法性 2.VLAN帧的最小帧长是64字节,其中表示帧优先级的字是PRI 3.WIFI6是2.4GHZ和5GHZ频段的,理论吞吐量最高可达9.6Gbps,遵从协议802.11ax,支持完整版的MU-MIMO 4.在大型无线网络中,AP通过DHCP option43端口来获取AC的IP地址 5.项目…...

二、数据模型

二、数据模型 数据模型回顾 数据模型&#xff08;Data Model&#xff09; 是信息领域采用的模型将现实世界的各种事物以及事物之间的联系&#xff0c;表示为数据以及数据之间的联系是对现实世界数据特征的抽象和模拟用来描述数据、组织数据和操作数是数据库系统的核心和基础 …...

获取淘宝店铺所有商品信息接口数据指南

在电商运营和数据分析中&#xff0c;获取淘宝店铺的商品信息是常见的需求。淘宝开放平台提供了丰富的 API 接口&#xff0c;方便开发者获取商品的详细信息&#xff0c;包括商品列表、商品详情、销量等。本文将详细介绍如何从零开始获取淘宝店铺的所有商品信息&#xff0c;包括注…...

目标检测工作原理:从滑动窗口到Haar特征检测的完整实现

目标检测探索指南 &#x1f50d; 目标检测就像是一位细心的侦探&#xff01;我们需要在图像中寻找并定位特定的目标&#xff0c;就像侦探在现场搜寻线索一样。让我们一起来探索这个充满挑战的图像处理领域吧&#xff01; 目录 1. 什么是目标检测&#xff1f;2. 滑动窗口检测3.…...

【LUT技术专题】针对降噪优化的通道感知轻量级LUT算法:DnLUT

DnLUT&#xff1a;Ultra-Efficient Color Image Denoising via Channel-Aware Lookup&#xff08;2025 CVPR&#xff09; 专题介绍一、研究背景二、DnLUT方法2.1 Pairwise Channel Mixer2.2 Rotation Non-overlapping Kernel&#xff08;L型卷积&#xff09; 三、实验结果四、总…...

支持同步观看的媒体服务器GhostHub

简介 什么是 GhostHub &#xff1f; GhostHub 是一个基于滑动界面的媒体服务器&#xff0c;旨在实现实时同步、聊天和隧道分享。它允许用户快速共享和浏览媒体内容&#xff0c;无需复杂的配置或帐户。 主要特点 零配置: 即开即用&#xff0c;无需安装或创建帐户。滑动浏览: 提…...

告别 pip:使用 uv 加速你的 Python 包管理

使用 uv:更快的 Python 包管理工具 随着 Python 生态的演进,包管理工具也在不断升级迭代。uv 是 Astral(同样维护 ruff 的团队)推出的下一代 Python 包与项目管理器,主打 单一可执行文件、极致性能,可在多数场景下取代 pip、pip-tools、pipx 与 virtualenv 等传统工具,…...

使用glsl 来做视频矫正

描述、优点 使用glsl来代替opencv的undistort 和 鱼眼矫正,并且最后使用opencv的LUT给glsl 来使用,来达到加速的目的,并且做到和opencv 一模一样的效果,达到实时视频的加速矫正。 优点: 没有cuda,也可以做到实时视频矫正,包含各类板子和amd的cpu,intel核显 矫正的基本作…...

【VSCode】快捷键合集(持续更新~)

一、基础编辑操作 注释/取消注释 Ctrl /&#xff1a;快速注释或取消注释当前行或选中行。ctrlshift/&#xff1a;块注释 代码格式化 • Shift Alt F&#xff1a;格式化整个文档&#xff0c;统一代码风格。 行操作 • Alt ↑/↓&#xff1a;向上/向下移动当前行。 • Shi…...

MATLAB学习笔记(七):MATLAB建模城市的雨季防洪排污的问题

使用 MATLAB 对城市雨季防洪排污问题进行建模与仿真&#xff0c;需要结合数学模型、工程经验和 MATLAB 的数值计算、数据可视化及优化工具。以下是详细的步骤指南&#xff0c;包含实际案例和代码示例&#xff1a; 一、问题分析与建模框架 1. 问题拆解 • 核心目标&#xff1a; …...

由浮点数x的位级表示求其整型值

由浮点数x的位级表示&#xff0c;得到浮点数的十进制表示&#xff0c;在超过32位整型数的表示范围时&#xff0c;返回0X80000000&#xff1b;在32位整型数的表示范围内时&#xff0c;返回强制转化为整型的值。舍入时采用向0舍入。 程序代码 typedef unsigned long int float_…...

【Qt】Qt常见控件的相关知识点

1.close退出槽函数 2.设置快捷键&#xff0c;QMenu 。 适用&字母就能设置快捷键&#xff0c;运行qt程序&#xff0c;最后就可以按Alt对应的字母进行快捷操作。 3.QMenuBar内存泄露问题 如果ui已经自动生成了menubar&#xff0c;我们再次生成一个新的菜单栏&#xff0c;而…...

数据结构*优先级队列(堆)

什么是优先级队列(堆) 优先级队列一般通过堆&#xff08;Heap&#xff09;这种数据结构来实现&#xff0c;堆是一种特殊的完全二叉树&#xff0c;其每个节点都满足堆的性质。如下图所示就是一个堆&#xff1a; 堆的存储方式 由于堆是一棵完全二叉树&#xff0c;所以也满足二…...

Windows本地化部署Dify完整指南

Windows本地化部署Dify完整指南 作者&#xff1a;朱元禄 版权声明&#xff1a;本文为朱元禄原创文章&#xff0c;转载请注明出处及作者信息 关键词&#xff1a;Dify部署,Windows安装Dify,Dify本地化,Dify教程,Dify配置,朱元禄 一、Docker Desktop安装与配置 1.1 下载Docker De…...

全局异常处理:如何优雅地统一管理业务异常

在软件开发中&#xff0c;异常处理是保证系统健壮性的重要环节。一个良好的异常处理机制不仅能提高代码的可维护性&#xff0c;还能为使用者提供清晰的错误反馈。本文将介绍如何通过全局异常处理和业务异常统一处理来编写更加优雅的代码。 一、传统异常处理的痛点 1.1 典型问…...

AI517 AI本地部署 docker微调(失败)

本地部署AI 计划使用OLLAMA进行本地部署 修改DNS 访问github 刷新缓存 配置环境变量 OLLAMA安装成功 部署成功 计划使用docker进行微调 下载安装docker 虚拟化已开启 开启上面这些 准备下载ubuntu docker ragflow dify 用git去泡...

C++(初阶)(十八)——AVL树

AVL树 AVL树概念实现AVL树的结点插入插入方法 平衡因子更新更新停止条件旋转右单旋左单旋左右双旋右左双旋 遍历AVL平衡检测 完整代码 概念 1&#xff0c;AVL树是最先发明的⾃平衡⼆叉查找树&#xff0c;AVL树是⼀颗⾼度平衡搜索⼆叉树&#xff0c; 通过控制高度差去控制平衡。…...

2022河南CCPC(前四题)

签到题目 #include <bits/stdc.h> using namespace std; #define int long long #define PII pair<int,int> #define fi first #define se second #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);void solve() {int n;cin>>…...

【滑动窗口】LeetCode 1658题解 | 将 x 减到 0 的最小操作数

将 x 减到 0 的最小操作数 一、题目链接二、题目三、题目解析四、算法原理五、编写代码六、时空复杂度 一、题目链接 将 x 减到 0 的最小操作数 二、题目 三、题目解析 以示例1为例&#xff1a; 四、算法原理 像"题目解析"中正面删除并修改数组元素的操作太困难&…...

电机试验平台:创新科技推动电动机研究发展

电机试验平台是电机制造和研发过程中不可或缺的重要设备&#xff0c;其功能涵盖了电机性能测试、电机寿命测试、电机质量评估等多个方面。随着科技的不断发展和电机应用领域的日益扩大&#xff0c;对电机试验平台的要求也越来越高。本文将从现代化电机试验平台的设计与应用两个…...

linux-软件的安装与部署、web应用部署到阿里云

一、软件安装方式概述 CentOS安装软件的方式主要包括&#xff1a; - 源码安装 - rpm安装&#xff08;二进制安装&#xff09; - yum安装&#xff08;在线安装&#xff09; 1.源码安装&#xff1a; 源码包是指C等语言所开发的源代码文件的一个压缩包&#xff0c;通常压缩为.…...

Qt Widgets模块功能详细说明,基本控件:QLabel(一)

一、基本控件&#xff08;Widgets&#xff09; Qt 提供了丰富的基本控件&#xff0c;如按钮、标签、文本框、复选框、单选按钮、列表框、组合框、菜单、工具栏等。 1、QLabel 1.1、概述 (用途、继承关系) QLabel 是 Qt 框架中用于显示文本、图像或动画的控件&#xff0c;属…...

Ubuntu 安装 squid

1. 安装Squid及工具 Debian/Ubuntu sudo apt update sudo apt install squid apache2-utils CentOS/RHEL sudo yum install squid httpd-tools 2. 创建用户名密码文件 创建密码文件&#xff08;首次使用 -c 参数&#xff0c;后续添加用户省略&#xff09; sudo htpasswd…...

中药药效成分群的合成生物学研究进展-文献精读130

Advances in synthetic biology for producing potent pharmaceutical ingredients of traditional Chinese medicine 中药药效成分群的合成生物学研究进展 摘要 中药是中华民族的文化瑰宝&#xff0c;也是我国在新药创制领域的重要驱动力。许多中药材来源于稀缺物种&#xf…...

芯片生态链深度解析(三):芯片设计篇——数字文明的造物主战争

【开篇&#xff1a;设计——数字文明的“造物主战场”】 当英伟达的H100芯片以576TB/s显存带宽重构AI算力边界&#xff0c;当阿里平头哥倚天710以RISC-V架构实现性能对标ARM的突破&#xff0c;这场围绕芯片设计的全球竞赛早已超越技术本身&#xff0c;成为算法、架构与生态标准…...

Echart地图数据源获取

DataV.GeoAtlas地理小工具系列 选择需要的区域地图,选中后输出即可: 地图钻取代码 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>map</title><style>html, body, #map{margin: 0;…...

【C++ - 仿mudou库one thread one loop式高并发服务器实现】

文章目录 项目介绍项目模块和服务器主要设计模式项目主要流程前置知识1.bind函数2.定时器任务TimerTask和时间轮思想TimerWheel3.正则表达式4.通用型容器Any类 服务器设计模式1&#xff09;单Reactor单线程模式2&#xff09;单Reactor多线程模式3&#xff09;多Reactor多线程模…...

本地缓存更新方案探索

文章目录 本地缓存更新方案探索1 背景2 方案探索2.1 初始化2.2 实时更新2.2.1 长轮询2.2.1.1 client2.2.2.2 server 本地缓存更新方案探索 1 背景 大家在工作中是否遇到过某些业务数据需要频繁使用&#xff0c;但是数据量不大的情况&#xff0c;一般就是几十条甚至几百条这种…...

Java—异常体系

Java的异常体系是Java语言中用于处理程序运行过程中可能出现的错误的机制。通过异常处理&#xff0c;程序可以在遇到问题时自动反馈&#xff0c;从而避免程序崩溃。Java异常体系中包含两大类&#xff1a;错误(Error)和异常(Exception)。 一、错误&#xff08;Error&#xff09…...

深度学习(第3章——亚像素卷积和可形变卷积)

前言&#xff1a; 本章介绍了计算机识别超分领域和目标检测领域中常常使用的两种卷积变体&#xff0c;亚像素卷积&#xff08;Subpixel Convolution&#xff09;和可形变卷积&#xff08;Deformable Convolution&#xff09;&#xff0c;并给出对应pytorch的使用。 亚像素卷积…...

5.15 学习日志

1.SST&#xff08;总平方和&#xff09;、SSR&#xff08;回归平方和&#xff09;、SSE&#xff08;残差平方和&#xff09;之间的关系。 在使用线性回归模型时&#xff0c;经常提到的统计量MSE&#xff08;Mean Squared Error、均方误差&#xff09;&#xff1a;是 SSE 的平均…...

重排序模型解读:gte-multilingual-reranker-base 首个GTE系列重排模型诞生

模型介绍 gte-multilingual-reranker-base 模型是 GTE 模型系列中的第一个 reranker 模型&#xff0c;由阿里巴巴团队开发。 模型特征&#xff1a; Model Size: 306MMax Input Tokens: 8192 benchmark 关键属性&#xff1a; 高性能&#xff1a;与类似大小的 reranker 模型…...

计算机发展的历程

计算机系统的概述 一, 计算机系统的定义 计算机系统的概念 计算机系统 硬件 软件 硬件的概念 计算机的实体, 如主机, 外设等 计算机系统的物理基础 决定了计算机系统的天花板瓶颈 软件的概念 由具有各类特殊功能的程序组成 决定了把硬件的性能发挥到什么程度 软件的分类…...

【通用智能体】Search Tools:Open Deep Research 项目实战指南

Open Deep Research 项目实战指南 一、项目运行方式&#xff08;一&#xff09;运行环境要求&#xff08;二&#xff09;运行方式&#xff08;三&#xff09;传统本地运行&#xff08;四&#xff09;Docker 容器运行 二、操作步骤&#xff08;一&#xff09;使用搜索功能&#…...

nodejs 文件的复制

在 Node.js 中&#xff0c;文件复制操作可以通过多种方式实现&#xff0c;具体取决于文件大小、性能需求以及是否需要保留文件元数据&#xff08;如权限、时间戳等&#xff09;。以下是几种常见的文件复制方法及其示例代码&#xff1a; 1. 使用 fs.copyFile&#xff08;简单高…...

GO语言学习(三)

GO语言学习&#xff08;三&#xff09; GO语言的独特接口可以实现内容和面向对象组织的更加方便&#xff0c;我们从这里来详细的讲解接口&#xff0c;让大家感受一下interface的魅力 interface定义 首先接口是一组方法签名的组合&#xff0c;我们通过接口来实现定义对象的一…...

高频面试题(含笔试高频算法整理)基本总结回顾61

干货分享&#xff0c;感谢您的阅读&#xff01; &#xff08;暂存篇---后续会删除&#xff0c;完整版和持续更新见高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09;&#xff09; 备注&#xff1a;引用请标注出处&#xff0c;同时存在的问题请在相关博客留言…...

C++:C++内存管理

C 内存分区 C 内存分为 5 个主要区域&#xff1a; 栈 (Stack)&#xff1a;存储局部变量、函数参数和返回地址。由编译器自动分配和释放&#xff0c;效率高但空间有限。 堆 (Heap)&#xff1a;动态分配的内存区域&#xff0c;需手动管理&#xff08;new/delete 或 malloc/free…...

目标跟踪相关综述文章

文章年份会议/引用量IFObject tracking:A survery20067618Object Tracking Methods:A Review2019554Multiple object tracking: A literature review20201294Deep learning for multiple object tracking: a survey2019145Deep Learning for Visual Tracking:A Comprehensive S…...

JavaScript【6】事件

1.概述&#xff1a; 在 JavaScript 中&#xff0c;事件&#xff08;Event&#xff09;是浏览器或 DOM&#xff08;文档对象模型&#xff09;与 JavaScript 代码之间交互的一种机制。它代表了在浏览器环境中发生的特定行为或者动作&#xff0c;比如用户点击鼠标、敲击键盘、页面…...

Python训练打卡Day26

函数专题1&#xff1a;函数定义与参数 知识点回顾&#xff1a; 函数的定义变量作用域&#xff1a;局部变量和全局变量函数的参数类型&#xff1a;位置参数、默认参数、不定参数传递参数的手段&#xff1a;关键词参数传递参数的顺序&#xff1a;同时出现三种参数类型时 到目前为…...

通俗版解释CPU、核心、进程、线程、协程的定义及关系

通俗版解释&#xff08;比喻法&#xff09; 1. CPU 和核心 CPU 一个工厂&#xff08;负责干活的总部&#xff09;。核心 工厂里的车间&#xff08;比如工厂有4个车间&#xff0c;就能同时处理4个任务&#xff09;。 2. 进程 进程 一家独立运营的公司&#xff08;比如一家…...

微积分基本规则及示例解析

微积分中的基本规则是构成微积分理论和应用的基石。以下是一些微积分中的基本规则&#xff0c;我将用简单的例子来解释它们&#xff0c;以便小学生也能理解。 1. **极限规则**&#xff1a; - 常数的极限&#xff1a;\(\lim_{x \to a} c c\) - 例如&#xff0c;\(\lim…...

Baklib知识中台构建企业智能服务新引擎

知识中台构建智能服务新范式 随着企业数字化转型进入深水区&#xff0c;传统知识管理模式的局限性日益显现——分散的文档系统、低效的信息检索以及割裂的业务场景&#xff0c;严重制约着组织效能的释放。在此背景下&#xff0c;Baklib提出的知识中台解决方案&#xff0c;通过…...

Python实例题:Python百行制作登陆系统

目录 Python实例题 题目 python-login-systemPython 百行登录系统脚本 代码解释 用户数据库&#xff1a; 注册功能&#xff1a; 登录功能&#xff1a; 主程序&#xff1a; 运行思路 注意事项 Python实例题 题目 Python百行制作登陆系统 python-login-systemPython…...