Go 项目如何集成类似mybatisPlus插件呢?GORM走起!!
导读:
在 Go 项目中,虽然没有像 MyBatis Plus 这样特定的 ORM 插件,但可以使用功能相似的 Go ORM 框架,比如 GORM,它支持链式查询、自动迁移、预加载等功能,与 MyBatis Plus 有相似之处。通过一些插件或扩展,可以实现更丰富的功能,比如软删除、分页查询等。下面是 GORM 集成的一些步骤和相关插件的推荐,本文以之前集成的项目Go语言?IDEA能支持吗?增删查走起?_go idea-CSDN博客为模版在此基础上进行迭代。
目录
一、引入GORM
二、GORM能力:
2.1分页查询:
2.2软删除
2.3分页拓展
2.4链式查询
2.5自定义拓展
三、源码改造
3.1改造数据库连接类database.go
3.2改造中间件DBMiddleware
3.3 改造userDao.go
3.4 改造userService.go
3.5 改造router.go
3.6 改造main.go
四、启动
五、异常情况:
5.1解决思路:
六、复杂查询拓展:
6.1实体类Orders.go
6.2新增OrderInfoDTO.go
6.3新增GetUserWithOrders方法:
一、引入GORM
先在项目中引入 GORM:
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql # 根据你的数据库类型选择驱动
二、GORM能力:
GORM 提供了一些类似 MyBatis Plus 的功能,比如:
- 软删除:通过
gorm.Model或自定义字段来实现软删除。 - 条件查询:可以通过链式查询构建条件查询。
- 分页插件:可以手动实现分页,或使用封装的分页插件。
2.1分页查询:
go 一遍集成GORM 的 Limit 和 Offset 方法实现分页查询:
var users []User
db.Limit(10).Offset(20).Find(&users) // 查询第 21-30 条数据
2.2软删除
例如:通过 gorm.Model 或自定义字段来实现软删除。
type User struct {gorm.ModelName stringAge int
}db.Delete(&user) // 软删除
2.3分页拓展
可以手动实现分页,或使用封装的分页插件比如分页器 github.com/biezhi/gorm-paginator 。
2.4链式查询
GORM 支持链式调用来构建复杂的查询:
var users []User
db.Where("age > ?", 18).Find(&users)
2.5自定义拓展
如果需要类似 MyBatis Plus 的扩展功能,你可以通过自定义 GORM 的钩子函数(Hooks)或中间件,来实现数据插入、更新时自动添加字段等逻辑。GORM 提供了生命周期回调接口,可以在执行操作前后进行拦截和处理。
三、源码改造
3.1改造数据库连接类database.go
-
引入 GORM:通过
gorm.io/gorm和gorm.io/driver/mysql代替原来的database/sql。 -
初始化数据库连接:使用
gorm.Open()方法替代sql.Open(),并且支持更多的配置参数,比如charset=utf8mb4和parseTime=True。 -
GetDB 函数:返回
*gorm.DB类型的数据库实例,供其他模块使用。 -
这边删除了原先的func GetDB() *sql.DB { return DB } 方法
package configimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm""gorm.io/gorm/logger""log"
)var DB *gorm.DB// InitGormDatabase 初始化 GORM 数据库连接并返回 *gorm.DB
func InitGormDatabase() *gorm.DB {dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",AppConfig.Database.User,AppConfig.Database.Password,AppConfig.Database.Host,AppConfig.Database.Port,AppConfig.Database.DBName,)var err errorDB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: logger.Default.LogMode(logger.Info),})if err != nil {log.Fatalf("Failed to connect to database: %v", err)return nil}log.Println("GORM database successfully connected")return DB
}
3.2改造中间件DBMiddleware
这边说明一下,中间件的引入是刚搭建项目时想从java中的切面编程来实现跨功能关注点的处理。比如数据库的连接。但是呢go没有内置切面的支持。所以就引入了中间件模式,每次调用数据库操作都通过中间件来处理。下面是优化前的中间件:
package middlewareimport ("database/sql""go_tas/dao/database""log"
)type DBMiddleware struct {db *sql.DB
}func NewDBMiddleware() *DBMiddleware {return &DBMiddleware{db: database.GetDB(),}
}func (mw *DBMiddleware) ExecuteQuery(query string, args ...interface{}) (*sql.Rows, error) {rows, err := mw.db.Query(query, args...) // 使用中间件中保存的 dbif err != nil {return nil, mw.logError("Failed to execute query", err)}return rows, nil
}func (mw *DBMiddleware) ExecuteExec(query string, args ...interface{}) (int64, error) {result, err := mw.db.Exec(query, args...) // 使用中间件中保存的 dbif err != nil {return 0, mw.logError("Failed to execute exec", err)}insertID, err := result.LastInsertId()if err != nil {return 0, mw.logError("Failed to get last insert ID", err)}return insertID, nil
}func (mw *DBMiddleware) BeginTransaction() (*sql.Tx, error) {tx, err := mw.db.Begin() // 使用中间件中保存的 dbif err != nil {return nil, mw.logError("Failed to begin transaction", err)}return tx, nil
}func (mw *DBMiddleware) logError(message string, err error) error {log.Printf("%s: %v", message, err)return err
}
使用原生的 database/sql 改造为使用 GORM,可以直接使用 GORM 的功能来处理查询、事务等操作。GORM 已经封装了这些常见的操作,并且支持更简洁的 API。
下面是改造后的 middleware 模块,使用 GORM 替代 database/sql:
-
gorm.DB替换sql.DB:DBMiddleware中的db现在使用*gorm.DB,所有的数据库操作通过 GORM 进行。 -
ExecuteQuery方法:- 使用 GORM 的
Raw方法执行原生 SQL 查询,并通过Scan将结果映射到传入的model结构体。 - 原生 SQL 查询返回的结果可以映射到结构体切片中。
var users []User middleware.ExecuteQuery(&users, "SELECT * FROM users WHERE age > ?", 18) - 使用 GORM 的
-
ExecuteExec方法:- 使用 GORM 的
Exec方法执行修改(插入、更新、删除)语句。 - 返回执行后影响的行数,而不是插入 ID。
- 使用 GORM 的
-
事务管理:
- 使用 GORM 的
Begin方法开启事务,返回事务对象*gorm.DB。
tx, err := middleware.BeginTransaction() if err != nil {// handle error } // 在事务中执行操作 err = tx.Create(&user).Error if err != nil {tx.Rollback() } else {tx.Commit() }中间件现在可以使用 GORM 的功能,简化数据库操作并支持复杂的 ORM 功能。
- 使用 GORM 的
package middlewareimport ("go_tas/dao/database""log""gorm.io/gorm"
)type DBMiddleware struct {db *gorm.DB
}func NewDBMiddleware() *DBMiddleware {return &DBMiddleware{db: database.GetDB(), // 使用 GORM 的 DB 实例}
}// ExecuteQuery 执行查询语句
func (mw *DBMiddleware) ExecuteQuery(model interface{}, query string, args ...interface{}) error {result := mw.db.Raw(query, args...).Scan(model) // 使用 GORM 的 Raw 方法if result.Error != nil {return mw.logError("Failed to execute query", result.Error)}return nil
}// ExecuteExec 执行修改语句(插入、更新、删除)
func (mw *DBMiddleware) ExecuteExec(query string, args ...interface{}) (int64, error) {result := mw.db.Exec(query, args...) // 使用 GORM 的 Exec 方法if result.Error != nil {return 0, mw.logError("Failed to execute exec", result.Error)}return result.RowsAffected, nil // 返回影响的行数
}// BeginTransaction 开启事务
func (mw *DBMiddleware) BeginTransaction() (*gorm.DB, error) {tx := mw.db.Begin() // 使用 GORM 的事务支持if tx.Error != nil {return nil, mw.logError("Failed to begin transaction", tx.Error)}return tx, nil
}// logError 记录错误信息
func (mw *DBMiddleware) logError(message string, err error) error {log.Printf("%s: %v", message, err)return err
}
3.3 改造userDao.go
使用原生 SQL 改造为使用 GORM,可以直接利用 GORM 的模型操作方法来简化数据库操作。GORM 允许直接对结构体进行增删改查,而不需要手动编写 SQL 查询
package daoimport ("go_tas/entity""gorm.io/gorm""log"
)type UserDAO struct {db *gorm.DB
}// NewUserDAO 创建新的 UserDAO 实例
func NewUserDAO(db *gorm.DB) *UserDAO {return &UserDAO{db: db}
}// GetAllUsers 获取所有用户
func (dao *UserDAO) GetAllUsers() ([]entity.User, error) {var users []entity.User// 使用 GORM 查询所有用户if err := dao.db.Find(&users).Error; err != nil {log.Printf("Failed to get users: %v", err)return nil, err}return users, nil
}// CreateUser 创建新用户
func (dao *UserDAO) CreateUser(user *entity.User) (int64, error) {// 使用 GORM 创建用户if err := dao.db.Create(user).Error; err != nil {log.Printf("Failed to create user: %v", err)return 0, err}// 返回创建的用户 IDreturn int64(user.ID), nil
}
3.4 改造userService.go
使用 GORM 替代原生 SQL 操作来进行数据处理。可以将事务处理和数据库操作使用 GORM 的特性进行简化和改造
package serviceimport ("encoding/json""go_tas/dao""go_tas/entity""go_tas/utils""gorm.io/gorm""net/http"
)// GetUsers 获取所有用户
func GetUsers(w http.ResponseWriter, r *http.Request, db *gorm.DB) {userDAO := dao.NewUserDAO(db)users, err := userDAO.GetAllUsers()if err != nil {utils.HandleError(w, http.StatusInternalServerError, "Failed to retrieve users", err)return}respondWithJSON(w, http.StatusOK, users)
}// CreateUser 创建新用户
func CreateUser(w http.ResponseWriter, r *http.Request, db *gorm.DB) {var user entity.Userif err := json.NewDecoder(r.Body).Decode(&user); err != nil {utils.HandleError(w, http.StatusBadRequest, "Invalid request payload", err)return}// 开始一个事务tx := db.Begin()if tx.Error != nil {utils.HandleError(w, http.StatusInternalServerError, "Failed to begin transaction", tx.Error)return}defer func() {if r := recover(); r != nil {tx.Rollback() // 回滚事务utils.HandleError(w, http.StatusInternalServerError, "Internal server error", nil)}}()// 插入用户数据userDAO := dao.NewUserDAO(tx)if _, err := userDAO.CreateUser(&user); err != nil {tx.Rollback() // 回滚事务utils.HandleError(w, http.StatusInternalServerError, "Failed to create user", err)return}// 提交事务if err := tx.Commit().Error; err != nil {utils.HandleError(w, http.StatusInternalServerError, "Failed to commit transaction", err)return}respondWithJSON(w, http.StatusCreated, user)
}// respondWithJSON 处理JSON响应
func respondWithJSON(w http.ResponseWriter, status int, payload interface{}) {w.Header().Set("Content-Type", "application/json")w.WriteHeader(status)if err := json.NewEncoder(w).Encode(payload); err != nil {utils.HandleError(w, http.StatusInternalServerError, "Failed to encode response data", err)}
}
3.5 改造router.go
将 router 中的数据库操作从 dbMiddleware 改为使用 GORM 数据库连接,并清理代码逻辑
package routerimport ("github.com/gorilla/mux"httpSwagger "github.com/swaggo/http-swagger""go_tas/controller""go_tas/middleware""go_tas/service""gorm.io/gorm""net/http"
)func InitRouter(authMiddleware *middleware.CustomAuthMiddleware, db *gorm.DB) *mux.Router {r := mux.NewRouter()// 添加身份验证中间件r.Use(authMiddleware.Middleware)// 使用 GORM 数据库连接r.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) {service.GetUsers(w, r, db)}).Methods("GET")r.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) {service.CreateUser(w, r, db)}).Methods("POST")// 设备控制接口r.HandleFunc("/tas/control", controller.Control).Methods("POST")r.HandleFunc("/tas/adminControl", controller.AdminControl).Methods("POST")// Swagger Handlerr.PathPrefix("/swagger/").Handler(httpSwagger.WrapHandler)return r
}
3.6 改造main.go
main 函数中,可以将原本使用的 dbMiddleware 改为直接使用 GORM 初始化的数据库连接,以便与前面改造的代码保持一致
package mainimport ("go_tas/config""go_tas/logger""go_tas/middleware""go_tas/router""log""net/http"
)func main() {// 初始化配置config.InitConfig()log.Println("Config initialized")// 初始化数据库,获取 GORM 数据库连接db := config.InitGormDatabase()if db == nil {log.Fatal("Failed to initialize database")}log.Println("Database initialized with GORM")// 初始化 Redisconfig.InitRedis()log.Println("Redis initialized")// 初始化日志logger.InitLogger()// 初始化认证中间件appCode := config.AppConfig.AppCodeappSecret := config.AppConfig.AppSecretauthMiddleware := middleware.NewCustomAuthMiddleware(appCode, appSecret)// 初始化路由并传递 GORM 数据库连接r := router.InitRouter(authMiddleware, db)log.Println("authMiddleware initialized")// 启动服务器log.Println("Starting server on :8080")log.Fatal(http.ListenAndServe(":8080", r))
}
四、启动

五、异常情况:
如果提示Table 'go_data_base.users' doesn't exist这种情况可以查看一下实体类,原因可能是由于查询时表名不匹配造成的。GORM 默认会使用复数形式表名进行查询,因此它在查找 users 表,而你的实际表名是 user。
5.1解决思路:
可以通过在 GORM 模型中设置表名
package entitytype User struct {ID int `json:"id"`Name string `json:"name"`Email string `json:"email"`
}// TableName 指定表名为 user
func (User) TableName() string {return "user"
}
六、复杂查询拓展:
如果涉及多表关联查询则可使用Joins来进行SQL联表查询,下面举个栗子:
6.1实体类Orders.go
package entitytype Orders struct {ID int `json:"id"`UserId int `json:"user_id"`Amount int `json:"amount"`Description string `json:"description"`
}func (Orders) TableName() string {return "orders"
}
6.2新增OrderInfoDTO.go
package dtotype OrderInfoDTO struct {ID int `json:"id"`Name string `json:"name"`Email string `json:"email"`Amount int `json:"amount"`Description string `json:"description"`
}
6.3新增GetUserWithOrders方法:
在userDao.go 新增一个GetUserWithOrders方法,Joins 用于执行 SQL 联表查Select("users.*, orders.amount") 指定返回的字段,你可以选择返回哪些表的字段Scan(&users) 将查询结果扫描到 users 切片中。
func (dao *UserDAO) GetUsersWithOrderInfo() ([]dto.OrderInfoDTO, error) {var userInfo []dto.OrderInfoDTOerr := dao.db.Table("user").Joins("LEFT JOIN orders ON orders.user_id = user.id").Select("user.*, orders.*").Scan(&userInfo).Errorif err != nil {log.Printf("Failed to get users with order info: %v", err)return nil, err}return userInfo, nil
}
最后将数据库的语句:
DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户ID',`amount` int(10) NULL DEFAULT NULL COMMENT '支付金额/分',`description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '商品描述',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;
如果需要源码的同学评论区把邮箱放置一下哈!
相关文章:
Go 项目如何集成类似mybatisPlus插件呢?GORM走起!!
导读: 在 Go 项目中,虽然没有像 MyBatis Plus 这样特定的 ORM 插件,但可以使用功能相似的 Go ORM 框架,比如 GORM,它支持链式查询、自动迁移、预加载等功能,与 MyBatis Plus 有相似之处。通过一些插件或扩…...
《深度学习》Dlib库 CNN卷积神经网络 人脸识别
目录 一、如何实现CNN人脸识别 1、CNN核心概念 1)卷积层 2)池化层 3)激活函数 4)全连接层 2、步骤 1)加载预训练的人脸识别模型 2)读取图像并检测人脸 3)提取人脸特征向量 4…...
滚雪球学Redis[7.1讲]:Redis实战案例
全文目录: 🎉前言🚦1. 使用Redis实现会话管理在Web应用中使用Redis管理会话会话过期与刷新策略安全性考虑与优化 🧩2. 使用Redis实现缓存系统缓存的基本原理Redis缓存的应用场景缓存失效策略与雪崩预防 ✨3. Redis在排行榜系统中的…...
WordPress外部图片本地化插件
一款用于本地化文章的外部图片的插件,支持如下功能: 文章发布前通过编辑器插件本地化 文章手动发布时自动本地化 文章定时发布时自动本地化 针对已发布的文章批量本地化。 源码下载:https://download.csdn.net/download/m0_66047725/898963…...
Linux基础-shell的简单实现
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 Linux基础-shell的简单实现 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1, 全局变…...
Tomcat日志文件详解及catalina.out日志清理方法
目录 前言1. Tomcat日志文件详解1.1 catalina.out1.2 localhost_access_log1.3 catalina.<date>.log1.4 host-manager.<date>.log 和 manager.<date>.log1.5 localhost.<date>.log 2. catalina.out文件管理与清理方法2.1 为什么不能直接删除catalina.o…...
react 中的hooks中的useState
(1). State Hook让函数组件也可以有state状态, 并进行状态数据的读写操作 (2). 语法: const [xxx, setXxx] React.useState(initValue) (3). useState()说明:参数: 第一次初始化指定的值在内部作缓存返回值: 包含2个元素的数组, 第1个为内部当前状态值, 第2个为更新状态值的…...
STM32学习笔记---DMA
目录 一、什么是DMA 1、DMA是什么 2、DMA的工作流程 3、DMA控制器与外设控制器 二、如何配置DMA 1、DMA框图 2、功能说明 2.1 通道选择 2.2 仲裁器 2.3 源、目标和传输模式 2.4 指针递增 2.5 循环模式 2.6 DMA流控制器和外设流控制器 3、程序设计 三、具体使用DMA…...
Cesium 实战 - 自定义纹理材质 - 立体墙(旋转材质)
Cesium 实战 - 自定义纹理材质 - 立体墙(旋转材质) 核心代码完整代码在线示例Cesium 给实体对象(Entity)提供了很多实用的样式,基本满足普通项目需求; 但是作为 WebGL 引擎,肯定不够丰富,尤其是动态效果样式。 对于实体对象(Entity),可以通过自定义材质,实现各种…...
进程间关系与守护进程
一、进程组 1.1、什么是进程组 提到进程的概念, 其实每一个进程除了有一个进程 ID(PID)之外 还属于一 个进程组。进程组是一个或者多个进程的集合, 一个进程组可以包含多个进程。 每一 个进程组也有一个唯一的进程组 ID(PGID), 并且这个 PG…...
金山翻译接口逆向
网址(加密后):aHR0cHM6Ly93d3cuaWNpYmEuY29tL3RyYW5zbGF0ZQ 文章目录 抓包sign值结果加密 逆向sign值第一步第二步1.2.3. 解密content第一步1.2.3. 抓包 F12 -> 翻译框输入spider -> 点击Fetch/XHR -> 找到接口 index.php? 开头的…...
unified-runtime编译与验证
unified-runtime编译与验证 一.创建容器二.编译unified-runtime三.生成一个cuda ptx kernel四.API测试 unified-runtime编译与验证 一.创建容器 docker run --gpus all --shm-size32g -ti \-e NVIDIA_VISIBLE_DEVICESall --privileged --nethost \--rm -it \-v $PWD:/home \-…...
【Python】最详细--基础语法
Python是一种强大且易于学习的编程语言,广泛用于各种应用程序的开发,如web开发、数据科学、人工智能等。以下是一些Python的基础知识: 1. Python的注释 Python的注释用于在代码中添加说明,以提高代码的可读性。注释在代码执行时…...
二叉树基础:什么样的二叉树适合用数组来存储?
二叉树基础:什么样的二叉树适合用数组来存储? 在计算机科学中,二叉树是一种非常重要的数据结构。它具有许多应用,如搜索、排序、表达式解析等。在存储二叉树时,我们可以使用多种方法,其中一种是使用数组。但是,并不是所有的二叉树都适合用数组来存储。那么,什么样的二…...
iTOP-RK3568开发板独立NPU通过算法加特应用到以下的场景
iTOP-3568开发板采用瑞芯微RK3568处理器,内部集成了四核64位Cortex-A55处理器。主频高达2.0Ghz,RK809动态调频。集成了双核心架构GPU,ARM G52 2EE、支持OpenGLES1.1/2.0/3.2、OpenCL2.0、Vulkan1.1、内嵌高性能2D加速硬件。 内置独立NPU,算力…...
Java基于SpringBoot微信小程序的跳蚤市场系统设计与实现(lw+数据库+讲解等)
项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…...
【分布式微服务云原生】《Redis 的高效之道:线程模型、IO 模型与 Reactor 模型全解析》
标题:《分布式缓存Redis 的高效之道:线程模型、IO 模型与 Reactor 模型全解析》 摘要:本文深入探讨分布式缓存 Redis 的 I线程模型、IO 模型以及 Reactor 模型。详细介绍了 Redis 在不同版本中的线程变化、IO 模型的特点和工作流程ÿ…...
科研类型PPT的制作技巧
目录 科研类型PPT的制作技巧 荣誉: 首页:ppt开头结尾 小标题 重点标记:加粗红色下划线 使用三线表 图片,文本排版 一、明确目的与受众分析 二、基础设计原则 三、内容组织与呈现 四、绘图与模型制作 五、其他注意事项 科研类型PPT的制作技巧 荣誉: 首页:ppt开…...
rom定制系列------小米6x_MIUI14_安卓13刷机包修改写入以及功能定制 界面预览
在接待一些定制化系统中。有很多工作室或者一些特殊行业的友友需要在已有固件基础上简略修改其中的功能。方便使用。例如usb调试默认开启。usb安装设置以及usb安装与内置删减一些app的定制服务。今天给友友预览其中小米6X此款机型定制相关的一些界面与功能演示。 定制机型以及…...
线性代数基础02
目录 1.向量 1.1向量的定义 1.2向量的运算 1.2.1向量加法 1.2.2向量数乘 1.2.3向量点积 1.3矩阵的特征值和特征向量 1.4向量的模 1.4.1向量的模的定义 1.4.2向量的模的几何解释 1.4.3向量的模的性质 1.5向量的内积 1.5.1向量的内积的定义 1.5.2向量的内积的几何解…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...
StarRocks 全面向量化执行引擎深度解析
StarRocks 全面向量化执行引擎深度解析 StarRocks 的向量化执行引擎是其高性能的核心设计,相比传统行式处理引擎(如MySQL),性能可提升 5-10倍。以下是分层拆解: 1. 向量化 vs 传统行式处理 维度行式处理向量化处理数…...
