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

Go-Gin Web 框架完整教程

1. 环境准备

1.1 Go 环境安装

Go 语言(或称 Golang)是一个开源的编程语言,由 Google 开发。在开始使用 Gin 框架之前,我们需要先安装 Go 环境。

安装步骤:

  1. 访问 Go 官网下载页面:https://golang.org/dl/
  2. 根据你的操作系统选择相应的安装包
    • Windows:下载 .msi 安装包,双击运行安装程序
    • Mac:下载 .pkg 安装包,双击运行安装程序
    • Linux:下载 tar.gz 包,解压并配置环境变量

安装完成后,打开终端输入以下命令验证安装:

go version

如果显示 Go 版本号,说明安装成功。

1.2 设置 Go 环境变量

Go 项目的工作效率很大程度上依赖于正确的环境变量配置。以下是主要的环境变量:

  • GOPATH:Go 工作空间的路径,存放 Go 项目代码和依赖包
  • GOROOT:Go 安装目录的路径
  • PATH:需要将 Go 的可执行文件目录添加到系统路径中

配置方法:

# Linux/Mac(添加到 ~/.bashrc 或 ~/.zshrc)
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin# Windows(系统环境变量)
set GOPATH=C:UsersYourNamego
set PATH=%PATH%;%GOPATH%bin

配置说明:

  • GOPATH 是你的工作目录,所有的 Go 项目都会在这个目录下
  • 将 $GOPATH/bin 添加到 PATH 中,这样你就能直接运行 Go 安装的工具

2. 项目初始化

2.1 创建项目目录

首先,我们需要创建一个新的项目目录。这个目录将包含我们所有的项目文件:

mkdir my-gin-app
cd my-gin-app

这里 my-gin-app 是项目名称,你可以根据自己的需求修改。

2.2 初始化 Go 模块

Go 模块是 Go 管理依赖的方式。使用以下命令初始化一个新的 Go 模块:

go mod init my-gin-app

这个命令会创建一个 go.mod 文件,它用于:

  • 定义模块路径
  • 记录项目依赖
  • 控制依赖版本
2.3 安装 Gin 框架

Gin 是一个用 Go 语言编写的 Web 框架。使用以下命令安装:

go get -u github.com/gin-gonic/gin

这个命令会:

  • 下载 Gin 框架的最新版本
  • 将依赖信息添加到 go.mod 文件
  • 生成 go.sum 文件记录依赖的具体版本

注意

无法连接到 Go 的默认代理服务器。在国内访问 golang.org 经常会遇到这个问题。我们可以通过使用国内镜像源来解决:

# 设置 GOPROXY 环境变量
# Windows PowerShell
$env:GOPROXY = "https://goproxy.cn,direct"# Windows CMD
set GOPROXY=https://goproxy.cn,direct# Linux/Mac
export GOPROXY=https://goproxy.cn,direct

设置完后,重新运行:

go get -u github.com/gin-gonic/gin

补充说明:

goproxy.cn 是七牛云提供的国内镜像源,也可以选择其他镜像:

  • https://goproxy.io
  • https://mirrors.aliyun.com/goproxy/
  • https://athens.azurefd.net

3. 项目结构

一个好的项目结构能够提高代码的可维护性和可读性。以下是推荐的项目结构:

my-gin-app/
├── config/             # 配置文件目录
│   ├── config.go      # 配置结构体定义
│   └── database.go    # 数据库配置
├── controllers/        # 控制器目录,处理请求和响应
│   ├── user.go        # 用户相关控制器
│   └── product.go     # 产品相关控制器
├── middleware/         # 中间件目录
│   ├── auth.go        # 认证中间件
│   └── logger.go      # 日志中间件
├── models/            # 数据模型目录
│   ├── user.go        # 用户模型
│   └── product.go     # 产品模型
├── routes/            # 路由配置目录
│   └── routes.go      # 路由定义
├── services/          # 业务逻辑目录
│   ├── user.go        # 用户相关业务逻辑
│   └── product.go     # 产品相关业务逻辑
├── utils/             # 工具函数目录
│   ├── jwt.go         # JWT 工具
│   └── validator.go   # 验证工具
├── main.go            # 应用程序入口
└── go.mod             # 依赖管理文件

目录说明:

  • config:存放配置文件,如数据库连接信息、应用程序设置等
  • controllers:处理 HTTP 请求,调用相应的 service 处理业务逻辑
  • middleware:存放中间件,如登录验证、日志记录、错误处理等
  • models:定义数据模型,对应数据库表结构
  • routes:配置 URL 路由规则
  • services:实现业务逻辑
  • utils:存放通用的工具函数
  • main.go:程序入口文件

4. 基础示例

4.1 创建入口文件

入口文件 main.go 是应用程序的起点。下面是一个基础的示例:

package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {// 创建默认的 gin 引擎r := gin.Default()// 定义一个简单的路由r.GET("/", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "Hello, Gin!",})})// 启动服务器r.Run(":8080")
}

代码说明:

  1. gin.Default():创建一个默认的 Gin 引擎,包含了 Logger 和 Recovery 中间件
  2. r.GET("/"):定义了一个 GET 请求的路由处理器
  3. gin.Context:包含了请求的上下文信息
  4. c.JSON():返回 JSON 格式的响应
  5. r.Run(":8080"):在 8080 端口启动服务器
4.2 添加控制器

控制器负责处理具体的业务逻辑。创建 controllers/user_controller.go

package controllersimport ("github.com/gin-gonic/gin""net/http"
)// 定义用户结构体
type User struct {ID   string `json:"id"`Name string `json:"name"`
}// 获取用户信息
func GetUser(c *gin.Context) {id := c.Param("id")  // 获取 URL 参数user := User{ID:   id,Name: "Test User",}c.JSON(http.StatusOK, user)
}// 创建新用户
func CreateUser(c *gin.Context) {var user User// 绑定 JSON 请求体到 user 结构体if err := c.ShouldBindJSON(&user); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}c.JSON(http.StatusCreated, user)
}

控制器说明:

  1. c.Param():获取 URL 参数
  2. c.ShouldBindJSON():将请求体绑定到结构体
  3. c.JSON():返回 JSON 响应
  4. HTTP 状态码的使用:
    • 200 (OK):成功获取资源
    • 201 (Created):成功创建资源
    • 400 (Bad Request):请求格式错误
4.3 配置路由

路由定义了 URL 和处理函数之间的映射关系。创建 routes/routes.go

package routesimport ("my-gin-app/controllers""github.com/gin-gonic/gin"
)func SetupRoutes(r *gin.Engine) {// 用户相关路由userGroup := r.Group("/users"){userGroup.GET("/:id", controllers.GetUser)userGroup.POST("/", controllers.CreateUser)}
}

路由说明:

  1. 路由分组:使用 r.Group() 创建路由组,方便管理相关的路由
  2. RESTful API 设计:
    • GET /users/:id:获取特定用户
    • POST /users:创建新用户
  3. 路由参数::id 是动态参数,可以在控制器中通过 c.Param("id") 获取
4.4 添加中间件

中间件用于在请求处理过程中执行一些通用的操作。创建 middleware/logger.go

package middlewareimport ("github.com/gin-gonic/gin""time""log"
)func Logger() gin.HandlerFunc {return func(c *gin.Context) {startTime := time.Now()// 处理请求c.Next()// 计算耗时endTime := time.Now()latency := endTime.Sub(startTime)// 记录日志log.Printf("[%s] %s %s %v", c.Request.Method,    // HTTP 方法c.Request.URL.Path,  // 请求路径c.ClientIP(),        // 客户端 IPlatency)            // 请求耗时}
}

中间件说明:

  1. gin.HandlerFunc:中间件函数类型
  2. c.Next():调用下一个处理函数
  3. 日志记录:
    • 请求方法 (GET, POST 等)
    • 请求路径
    • 客户端 IP
    • 处理时间

5. 完整应用示例

更新 main.go 以整合所有组件:

package mainimport ("my-gin-app/middleware""my-gin-app/routes""github.com/gin-gonic/gin"
)func main() {// 创建 gin 引擎r := gin.Default()// 使用自定义中间件r.Use(middleware.Logger())// 设置路由routes.SetupRoutes(r)// 启动服务器r.Run(":8080")
}

主函数说明:

  1. 引入必要的包:中间件和路由
  2. 创建 Gin 引擎
  3. 应用中间件:使用 r.Use() 全局应用中间件
  4. 设置路由:调用路由设置函数
  5. 启动服务器:在指定端口监听请求

6. 常用功能示例

6.1 查询参数处理
r.GET("/search", func(c *gin.Context) {query := c.Query("q")    // 获取查询参数page := c.DefaultQuery("page", "1")  // 带默认值的查询参数c.JSON(http.StatusOK, gin.H{"query": query,"page": page,})
})
6.2 表单处理
r.POST("/form", func(c *gin.Context) {name := c.PostForm("name")email := c.PostForm("email")c.JSON(http.StatusOK, gin.H{"name": name,"email": email,})
})
6.3 文件上传
r.POST("/upload", func(c *gin.Context) {file, _ := c.FormFile("file")// 保存文件c.SaveUploadedFile(file, "uploads/"+file.Filename)c.JSON(http.StatusOK, gin.H{"message": "File uploaded successfully","filename": file.Filename,})
})
6.4 分组路由
v1 := r.Group("/api/v1")
{v1.GET("/users", GetUsers)v1.POST("/users", CreateUser)
}v2 := r.Group("/api/v2")
{v2.GET("/users", GetUsersV2)v2.POST("/users", CreateUserV2)
}

7. 数据库集成(以 GORM 为例)

首先安装 GORM:

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

创建数据库连接:

package modelsimport ("gorm.io/gorm""gorm.io/driver/mysql"
)var DB *gorm.DBfunc InitDB() {dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {panic("Failed to connect to database")}DB = db
}

8. 测试

创建测试文件 main_test.go:

package mainimport ("net/http""net/http/httptest""testing""github.com/gin-gonic/gin""github.com/stretchr/testify/assert"
)func TestPingRoute(t *testing.T) {router := setupRouter()w := httptest.NewRecorder()req, _ := http.NewRequest("GET", "/ping", nil)router.ServeHTTP(w, req)assert.Equal(t, 200, w.Code)assert.Equal(t, `{"message":"pong"}`, w.Body.String())
}

9. 部署

9.1 编译
go build -o app
9.2 运行
./app

相关文章:

Go-Gin Web 框架完整教程

1. 环境准备 1.1 Go 环境安装 Go 语言(或称 Golang)是一个开源的编程语言,由 Google 开发。在开始使用 Gin 框架之前,我们需要先安装 Go 环境。 安装步骤: 访问 Go 官网下载页面:https://golang.org/dl…...

机器学习专业毕设选题推荐合集 人工智能

目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光,一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整理…...

Java程序员 面试如何介绍项目经验?

项目经历是面试过程中重点问的,但是很多人在回答的时候往往会有问题: 重点是介绍项目,而忽略了个人的经历。 经历是你做了什么、你怎么做的、做完后的结果。例如:项目中的哪些部分是你做的?你是不是核心人员&#xf…...

YONBIP后端环境搭建-IDEA

1、IDEA环境搭建 1.1、插件安装 打开设置窗口,添加自定义插件存储库路径。 https://nccdev.yonyou.com/ide/idea/latest/updatePlugin.xml 在 Marketplace 中搜索 YonBuilder Premium开发者工具 ,点击安装。 1.2、Home配置 点击Home配置按钮&#xf…...

Java 微服务实用指南(一)

Java 微服务:基础 要真正理解 Java 微服务,就必须从最基本的东西开始:为人诟病的 Java 大型单体应用是什么,它的优点和缺点是什么。 什么是 Java 大型单体应用? 假设你正在为一家银行或一家金融科技初创公司工作。你为…...

Windows图形界面(GUI)-QT-C/C++ - QT Frame

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 一、概述 二、使用场景 1. 分隔内容区域 2. 装饰性边框 3. 自定义控件容器 三、常见样式 1. 框架形状(Shape) 2. 框架阴影(Shadow)…...

优选算法合集————双指针(专题二)

好久都没给大家带来算法专题啦,今天给大家带来滑动窗口专题的训练 题目一:长度最小的子数组 题目描述: 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, …...

WebSocket协议里客户端发送给服务器的数据会用4字节的掩码循环异或的分析

首先,我需要回顾WebSocket协议中对掩码处理的具体要求。根据RFC 6455,客户端发送到服务器的帧必须使用掩码,而服务器发送的帧不需要掩码。掩码是4字节的,应用于有效载荷数据,每个字节依次与掩码的对应字节异或&#xf…...

【字节青训营-9】:初探字节微服务框架 Hertz 基础使用及进阶(下)

本文目录 一、Hertz中间件Recovery二、Hertz中间件跨资源共享三、Hertz 响应四、Hertz请求五、Hertz中间件Session 一、Hertz中间件Recovery Recovery中间件是Hertz框架预置的中间件,使用server.Default()可以默认注册该中间件,为Hertz框架提供panic回复…...

新版AndroidStudio 修改 jdk版本

一、问题 之前,在安卓项目中配置JDK和Gradle的过程非常直观,只需要进入Android Studio的File菜单中的Project Structure即可进行设置,十分方便。 如下图可以在这修改JDK: 但是升级AndroidStudio之后,比如我升级到了Android Stu…...

cocos spine执行动画报错Cannot read properties of null (reading ‘data‘)

cocos v3.8.3 当想this.spine.setAnimation(0, "action1", false);播放spine动画时报错↓ 解决方法一: 在setAnimation之前调用this.spine.__preload() 解决方法二: 不要让spine或其父节点通过active显隐...

笔记:新能源汽车零部件功率级测试怎么进行?

摘要:本文旨在梳理主机厂对新能源汽车核心零部件功率级测试需求,通过试验室的主流设备仪器集成,快速实现试验方案搭建,并体现测试测量方案的时效性、便捷性优势。目标是通过提升实现设备的有效集成能力、实现多设备测试过程的有效协同、流程化测试,可快速采集、分析当前数…...

【starrocks学习】之将starrocks表同步到hive

目录 方法 1:通过HDFS导出数据 1. 将StarRocks表数据导出到HDFS 2. 在Hive中创建外部表 3. 验证数据 方法 2:使用Apache Spark同步 1. 添加StarRocks和Hive的依赖 2. 使用Spark读取StarRocks数据并写入Hive 3. 验证数据 方法 3:通过…...

Linux提权--SUDO提权

​sudo​ 是 Linux 中常用的特权管理工具,允许普通用户以其他用户(通常是 root 用户)的身份运行命令。如果配置不当,攻击者可能通过滥用 sudo​ 权限来提升自己的权限。 一.常见的 sudo 提权方法: 误配置的 sudo 权限&…...

【AIGC提示词系统】基于 DeepSeek R1 + Claude 的新年运势占卜系统设计与实现

提示词在最下方 DeepSeek R1调试了整体的提示词,使用Claude进行渲染 引言 在人工智能与传统文化交融的今天,如何让 AI 充分理解并传递东方玄学文化的精髓,成为一个极具挑战性的课题。本文将详细介绍一个基于 Claude 的新年运势占卜系统的设计…...

11. Global Object 全局对象的使用

Global Object 全局对象 1 引言2 制作全局对象3 调用全局对象4 扩展使用1 引言 全局对象适用于大量重复的对象,比如阀门,电机等,如果这些设备的基本逻辑与状态都是一样的,那么就可以使用全局对象的方法来做HMI,省时省力。并且在后期修改的时候只需要修改全局对象即可。 …...

Java synchronized锁升级

偏向锁、轻量级锁和重量级锁是Java中synchronized关键字的三种锁状态,用于优化多线程环境下的性能。以下是它们的简要说明: 1. 偏向锁(Biased Locking) 目的:减少无竞争时的锁开销。适用场景:只有一个线程…...

【Hadoop】Hadoop的HDFS

这里写目录标题 HDFS概述HDFS产出背景及定义HDFS产生背景HDFS定义 HDFS优缺点HDFS优点HDFS缺点 HDFS组成架构HDFS文件块大小 HDFS的Shell操作常用命令实操准备工作上传下载HDFS直接操作 HDFS的API操作客户端环境准备HDFS的API案例实操HDFS文件上传HDFS文件下载HDFS文件更名和移…...

JAVA异步的TCP 通讯-客户端

一、客户端代码示例 import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousSocketChannel; import java.nio.channels.CompletionHandler; import java.util.concurrent.ExecutorService; impo…...

4.回归与聚类算法 4.1线性回归

4.1.1 线性回归的原理 1 线性回归应用场景: 房价预测 销售额度预测 金融:贷款额度预测,利用线性回归以及系数分析因子 2 什么是线性回归 1) 定义:利用回归方程(函数)对一个或者多个自变量…...

联想拯救者开机进入bios

如果你的联想拯救者(Lenovo Legion)笔记本电脑开机后直接进入 BIOS 设置界面,可能是以下原因之一导致的。以下是解决方法: 1. 检查启动顺序 进入 BIOS 后,找到 Boot(启动)选项卡。检查启动顺序…...

【贪心算法篇】:“贪心”之旅--算法练习题中的智慧与策略(四)

✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨ ✨ 个人主页:余辉zmh–CSDN博客 ✨ 文章所属专栏:贪心算法篇–CSDN博客 文章目录 前言例题1.合并区间2.无重叠的区间3.用最少数量的箭引爆气球…...

Junit5使用教程(3)

第三部分:JUnit 5 进阶 3. 动态测试 一、动态测试是什么? 动态测试(Dynamic Test)允许在运行时生成测试用例,而不是在编译时通过 Test 静态定义。它通过 TestFactory 注解标记的方法动态生成一组测试用例&#xff0…...

WPS中解除工作表密码保护(忘记密码)

1.下载vba插件 项目首页 - WPS中如何启用宏附wps.vba.exe下载说明分享:WPS中如何启用宏:附wps.vba.exe下载说明本文将详细介绍如何在WPS中启用宏功能,并提供wps.vba.exe文件的下载说明 - GitCode 并按照步骤安装 2.wps中点击搜索,输入开发…...

通向AGI之路:人工通用智能的技术演进与人类未来

文章目录 引言:当机器开始思考一、AGI的本质定义与技术演进1.1 从专用到通用:智能形态的范式转移1.2 AGI发展路线图二、突破AGI的五大技术路径2.1 神经符号整合(Neuro-Symbolic AI)2.2 世界模型架构(World Models)2.3 具身认知理论(Embodied Cognition)三、AGI安全:价…...

kamailio-osp模块

该文档详细讲解了如何在Kamailio中配置和使用OSP模块(Open Settlement Protocol Module),以实现基于ETSI标准的安全多边对等互联(Secure Multi-Lateral Peering)。以下是核心内容的总结: 1. 模块功能 OSP模…...

【Linux网络编程】:URL(encode),HTTP协议,telnet工具

🎁个人主页:我们的五年 🔍系列专栏:Linux网络编程 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 ​ Linux网络编程笔记: https://mp.csdn…...

SpringMVC SpringMVC响应 一、数据处理及跳转

1. 结果跳转方式 ①.ModelAndView 设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 <bean id"templateResolver" class"org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver"><property name"p…...

C++SLT(三)——list

目录 一、list的介绍二、list的使用list的定义方式 三、list的插入和删除push_back和pop_backpush_front和pop_frontinserterase 四、list的迭代器使用五、list的元素获取六、list的大小控制七、list的操作函数sort和reversemergeremoveremove_ifuniqueassignswap 一、list的介…...

基于Coze平台实现抖音链接提取文案转小红书文案的智能体开发全流程解析

文章目录 引言:跨平台内容运营的AI解法实例最终效果1. 平台特性对比与转化需求分析1.1 用户画像与内容风格对比1.2 文案转化核心需求2. Coze平台技术架构解析2.1 Coze核心能力矩阵2.2 关键技术组件选型3. 智能体工作流设计3.1 完整处理流程3.2 关键节点说明4. 核心模块实现详解…...

32. 最长有效括号

动态规划 dp[i]表示以i下标为结尾的最长有效括号的长度&#xff0c;取dp[i]中的最大值即可。 i从1开始判断&#xff0c;只有s[i])才需要判断&#xff1a; 如果s[i-1](&#xff0c;那么dp[i]dp[i-2]2&#xff0c;注意判断i-2的范围否则&#xff0c;如果dp[i-1]>0&#xff0…...

Linux常见问题解决方法--2

如何反爬 后台对访问进行统计&#xff0c;如果单个 IP 访问超过阈值&#xff0c;予以封锁 后台对访问进行统计&#xff0c;如果单个 session 访问超过阈值&#xff0c;予以封锁 后台对访问进行统计&#xff0c;如果单个 userAgent 访问超过阈值&#xff0c;予以封锁 以上的组…...

STM32H7和F7 主要区别

STM32H7和F7系列是STMicroelectronics推出的高性能ARM Cortex-M微控制器系列&#xff0c;二者在性能、外设和用途上有显著区别。以下是它们的主要区别&#xff1a; 1. 内核与性能 STM32H7&#xff1a; 内核&#xff1a;Cortex-M7&#xff08;单核或双核&#xff0c;部分型号带…...

软件测试丨PyTorch 图像目标检测

随着人工智能和机器学习的飞速发展&#xff0c;图像目标检测技术在各个领域扮演着越来越重要的角色。无论是在安防监控、自动驾驶车辆&#xff0c;还是在医疗影像分析和智能家居中&#xff0c;图像目标检测都发挥着不可或缺的作用。今天&#xff0c;我们将深入探讨其中一种热门…...

利用TensorFlow.js实现浏览器端机器学习:一个全面指南

引言 随着深度学习技术的不断发展&#xff0c;机器学习已从传统的服务器端运算逐渐转向了前端技术。TensorFlow.js 是 Google 推出的一个用于在浏览器中进行机器学习的开源库&#xff0c;它允许开发者在浏览器中直接运行机器学习模型&#xff0c;而无需依赖后端服务器。Tensor…...

全流程安装DeepSeek开源模型

目录 安装Ollama选择大模型安装大模型对话备注 安装Ollama 安装DeepSeek首先需要安装一个Ollama&#xff0c;这个软件相当于运行DeepSeek模型的底层&#xff0c;没有这个底层就没办法跑DeepSeek AI模型。 下载地址&#xff1a; https://ollama.com/点击下载windows版本&…...

VulnHub | Prime - 1

https://vulnhub.com/entry/prime-1,358/https://vulnhub.com/entry/prime-1,358/ 0x01&#xff1a;靶场简介 Prime 1 是 VulHub 中的一台用于 OSCP 考试练习的靶机。通过本靶机&#xff0c;我们可以系统的了解的渗透测试的全流程。本靶机的通关目标如下&#xff1a; Get The…...

实验十 Servlet(一)

实验十 Servlet(一) 【实验目的】 1&#xff0e;了解Servlet运行原理 2&#xff0e;掌握Servlet实现方式 【实验内容】 1、参考课堂例子&#xff0c;客户端通过login.jsp发出登录请求&#xff0c;请求提交到loginServlet处理。如果用户名和密码相同则视为登录成功&#xff0c…...

寒假刷题Day22

一、2570. 合并两个二维数组 - 求和法 class Solution { public:vector<vector<int>> mergeArrays(vector<vector<int>>& nums1, vector<vector<int>>& nums2) {int i 0, j 0, n1 nums1.size(), n2 nums2.size();int tmp 0;…...

KES数据库实践指南:探索KES数据库的事务隔离级别

引言 前两篇文章我们详细讲解了如何安装KES金仓数据库&#xff0c;并提供了快速查询和搭建基于coze平台的智能体的解决方案。今天&#xff0c;我们的焦点将放在并发控制机制和事务隔离级别上。 本文将通过一系列实验操作&#xff0c;深入探讨KES数据库中的并发控制机制和事务…...

基于STM32的智能加湿器设计(新版本)

目录 1、设计要求 2、系统功能 3、演示视频和实物 4、系统设计框图 5、软件设计流程图 6、原理图 7、主程序 8、总结 &#x1f91e;大家好&#xff0c;这里是5132单片机毕设设计项目分享&#xff0c;今天给大家分享的是加湿器。设备的详细功能见网盘中的文章《12、基于…...

Electricity Market Optimization 探索系列(三)

本文参考链接link 电网容量规划是一个寻求最优发电容量的过程&#xff0c;找到的最优发电容量能够可靠地满足未来电网的需求 发电机的容量和发电成本呈正相关关系&#xff0c;一台发电机的发电量不能超过其额定发电容量&#xff0c;结合我之前的博客所说的内容&#xff0c;可…...

JAVA进阶之线程

为神马有线程&#xff1f;这玩意儿在干嘛&#xff1f;&#xff1f;&#xff1f; 回答这个问题&#xff0c;就先要知道一点点计算机的工作方式。 总所周知&#xff0c;计算机有五部分&#xff1a;输入输出、计算器、存储器、控制器。而在计算机内&#xff0c;CPU、内存、I/O之…...

浙江安吉成新照明电器有限公司分布式光伏发电项目--安科瑞Acrel-1000DP分布式光伏监控系统

安科瑞 崔丽洁 项目背景 随着可再生能源的发展&#xff0c;分布式光伏发电成为重要的能源利用方式。浙江安吉成新照明电器有限公司 3234.465kWp 分布式光伏发电项目应运而生。该公司是螺旋节能灯毛管专业生产企业&#xff0c;于 2007 年 6 月成立&#xff0c;具备全自动生产线、…...

pytorch实现主成分分析 (PCA):用于数据降维和特征提取

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 使用 PyTorch 实现主成分分析&#xff08;PCA&#xff09;可以通过以下步骤进行&#xff1a; 标准化数据&#xff1a;首先&#xff0c;需要对数据进行标准化处理&#xff0c;确保每个特征的均值为 0&#xff0c;方差…...

2025_2_4 C语言中关于free函数及悬空指针,链表的一级指针和二级指指针

1.free函数 free函数所接受的参数只能是动态分配出来的内存&#xff0c;&#xff0c;否者free的行为是未定义的同一片内存空间不能被free两次 free过后的内存可能会引发悬空指针的问题 2.悬空指针 悬空指针的问题主要是free过后的内存空间&#xff0c;原先指向这片空间的指…...

pytorch逻辑回归实现垃圾邮件检测

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 完整代码&#xff1a; import torch import torch.nn as nn import torch.optim as optim from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.model_selection import train_test_split …...

一次线程数超限导致的hive写入hbase作业失败分析

1.集群配置 操作系统:SuSe操作系统 集群节点:100台相同配置的服务器 单台:核心112Core,内存396G 2.问题现象 现象1:跑单个入库任务报错,批量提交任务后出现OOM异常 执行12个hivesql,将数据写入hbase.hbase入库有近一半的任务报错。 每次报错的任务不是同一个,hivesql…...

JAVA安全—反射机制攻击链类对象成员变量方法构造方法

前言 还是JAVA安全&#xff0c;哎&#xff0c;真的讲不完&#xff0c;太多啦。 今天主要是讲一下JAVA中的反射机制&#xff0c;因为反序列化的利用基本都是要用到这个反射机制&#xff0c;还有一些攻击链条的构造&#xff0c;也会用到&#xff0c;所以就讲一下。 什么是反射…...

Java集合面试总结(题目来源JavaGuide)

问题1&#xff1a;说说 List,Set,Map 三者的区别&#xff1f; 在 Java 中&#xff0c;List、Set 和 Map 是最常用的集合框架&#xff08;Collection Framework&#xff09;接口&#xff0c;它们的主要区别如下&#xff1a; 1. List&#xff08;列表&#xff09; 特点&#xf…...