gin框架精通篇(二)

原生数据库使用

导入模块:go get -u github.com/go-sql-driver/mysql

安装 mysql 数据库

安装数据库可能遇到的问题:(网上的方法基本可以解决)
ERROR 1045 (28000): Access denied for user ‘-root’@‘localhost’ (using password: YES)
ERROR 2003 (HY000): Can’t connect to MySQL server on ‘localhost’ (10061)

可视化数据库操作

在这里插入图片描述

// 导包内容
package mainimport ("database/sql" // 导入sql包处理数据库操作"fmt" // 导入fmt包进行格式化输出和错误输出"github.com/gin-gonic/gin" // 导入gin包快速构建REST API_ "github.com/go-sql-driver/mysql" // 导入MySQL驱动"net/http" // 导入http包处理HTTP请求
)

注意别漏了:_ “github.com/go-sql-driver/mysql” // 导入MySQL驱动

var sqlDb *sql.DB // 声明一个sql.DB指针,用于后续的数据库操作
var sqlResponse SqlResponse // sqlResponse是全局的用于封装http返回的结构体
/** 请求结构体 和 响应结构体 */
// SqlUser结构体映射数据库中的user表
type SqlUser struct {Name    string `json:"name"` // 用户名Age     int    `json:"age"` // 年龄Address string `json:"address"` // 地址
}
// SqlResponse结构体用于封装http响应数据
type SqlResponse struct {Code    int         `json:"code"` // 响应状态码Message string      `json:"message"` // 响应消息Data    interface{} `json:"data"` // 响应数据
}
// init函数用于初始化数据库
func init() {// MySQL连接字符串sqlStr := "root:123456@tcp(127.0.0.1:3306)/testdb?charset=utf8&parseTime=true&loc=Local"var err error// 打开MySQL连接sqlDb, err = sql.Open("mysql", sqlStr)if err != nil {// 如果连接出错,则输出错误并返回fmt.Println("数据库打开出现了问题:", err)return}// 测试与数据库的连接是否存活err = sqlDb.Ping()if err != nil {fmt.Println("数据库打开出现了问题:", err)return}
}
// 主函数
func main() {r := gin.Default()r.POST("/sql/insert", insertData)r.GET("/sql/read", readData)r.GET("/sql/readAll", readAllData)r.PUT("/sql/update", updateData)r.DELETE("/sql/del", delData)r.Run(":9090")
}

// insertData函数处理插入数据的请求
func insertData(context *gin.Context) {var u SqlUser// 绑定请求中的JSON数据到u结构体err := context.Bind(&u)if err != nil {// 如果绑定出错,设置响应结构体并返回JSON响应sqlResponse.Code = http.StatusBadRequestsqlResponse.Message = "参数错误"sqlResponse.Data = "error"context.JSON(http.StatusOK, sqlResponse)return}// 定义插入SQL语句sqlStr := "insert into user(name, age, address) values (?,?,?)"// 执行插入操作ret, err := sqlDb.Exec(sqlStr, u.Name, u.Age, u.Address)if err != nil {// 如果插入出错,设置响应结构体并返回JSON响应fmt.Println(err)sqlResponse.Code = http.StatusBadRequestsqlResponse.Message = "写入失败"sqlResponse.Data = "error"context.JSON(http.StatusOK, sqlResponse)return}// 插入成功,设置响应结构体sqlResponse.Code = http.StatusOKsqlResponse.Message = "写入成功"sqlResponse.Data = "OK"// 返回JSON响应context.JSON(http.StatusOK, sqlResponse)// 打印插入的IDfmt.Println(ret.LastInsertId())
}

在这里插入图片描述

// readData函数处理读取数据的请求:单条数据
func readData(context *gin.Context) {name := context.Query("name") // 从查询参数获取name// 定义查询SQL语句sqlStr := "select age,address from user where name=?"var u SqlUser// 执行查询,并扫描结果到u结构体err := sqlDb.QueryRow(sqlStr, name).Scan(&u.Age, &u.Address)if err != nil {// 如果查询出错,设置响应结构体并返回JSON响应fmt.Println(err)sqlResponse.Code = http.StatusBadRequestsqlResponse.Message = "读取失败"sqlResponse.Data = "error"context.JSON(http.StatusOK, sqlResponse)return}// 查询成功,填充姓名,并设置响应结构体u.Name = namesqlResponse.Code = http.StatusOKsqlResponse.Message = "读取成功"sqlResponse.Data = u// 返回JSON响应context.JSON(http.StatusOK, sqlResponse)
}

在这里插入图片描述

func readAllData(context *gin.Context) {// 从Http请求中获取地址参数(address)address := context.Query("address")// 定义SQL查询语句,根据特定地址(address)查询与之匹配的所有用户名称(name)和用户年龄(age)sqlStr := "select name, age from user where address=?"// 使用预定义的sqlDb对象执行刚刚定义的SQL查询语句rows, err := sqlDb.Query(sqlStr, address)// 如果在执行SQL查询语句过程中出现错误,将错误信息打印到控制台,并向HTTP响应中写入相应的错误信息,然后退出当前函数if err != nil {fmt.Println(err)sqlResponse.Code = http.StatusBadRequestsqlResponse.Message = "读取失败"sqlResponse.Data = "error"context.JSON(http.StatusOK, sqlResponse)return}// 定时关闭数据库连接defer rows.Close()// 定义一个空切片,用来存储所有查询到的用户数据resUser := make([]SqlUser, 0)// 遍历数据库查询结果集rows,提取所有的数据并添加到之前定义的用于存储用户数据的切片中for rows.Next() {var userTemp SqlUser// 将从结果集中获取到的每一行数据相应的字段(name, age)提取出来,赋值给用户结构体(userTemp)对应的字段rows.Scan(&userTemp.Name, &userTemp.Age)// 将地址字段值设置为查询参数userTemp.Address = address// 将该用户结构体添加到用户切片中resUser = append(resUser, userTemp)}// 设置HTTP响应的状态码、消息和数据内容,然后将其写入到HTTP响应中。这里写入的数据内容就是查询到的所有用户数据sqlResponse.Code = http.StatusOKsqlResponse.Message = "读取成功"sqlResponse.Data = resUsercontext.JSON(http.StatusOK, sqlResponse)
}

在这里插入图片描述

func updateData(context *gin.Context) {// 定义一个SqlUser类型的变量u,用于存储请求中的用户数据var u SqlUser// 定义一个整型变量count,用于存储数据库查询返回的计数结果var count int// 使用context.Bind()方法从HTTP请求体中提取数据并绑定到变量u中err := context.Bind(&u)// 如果在数据绑定过程中发生错误,则向客户端发送参数错误的响应if err != nil {sqlResponse.Code = http.StatusBadRequestsqlResponse.Message = "参数错误"sqlResponse.Data = "error"context.JSON(http.StatusOK, sqlResponse)return}// 定义SQL查询字符串,用于检查具有特定名称的用户是否存在于数据库中sqlStr := "select count(*) from user where name=?"// 执行SQL查询,将查询结果(即用户的数量)存储于变量count中err = sqlDb.QueryRow(sqlStr, u.Name).Scan(&count)// 如果查询结果显示用户数量为0或查询时发生错误,则向客户端发送数据不存在的响应if count <= 0 || err != nil {sqlResponse.Code = http.StatusBadRequestsqlResponse.Message = "更新的数据不存在"sqlResponse.Data = "error"context.JSON(http.StatusOK, sqlResponse)return}// 定义SQL更新字符串,用于更新用户的年龄(age)和地址(address)upStr := "update user set age=?, address=? where name=?"// 执行SQL更新操作ret, err := sqlDb.Exec(upStr, u.Age, u.Address, u.Name)// 如果在执行更新操作时发生错误,则向客户端发送更新失败的响应if err != nil {fmt.Println(err)sqlResponse.Code = http.StatusBadRequestsqlResponse.Message = "更新失败"sqlResponse.Data = "error"context.JSON(http.StatusOK, sqlResponse)return}// 如果更新操作成功,向客户端发送更新成功的响应sqlResponse.Code = http.StatusOKsqlResponse.Message = "更新成功"sqlResponse.Data = "OK"context.JSON(http.StatusOK, sqlResponse)// 打印到控制台SQL操作返回的结果,这通常用于调试// 注意:这里的LastInsertId()在更新操作中可能不会返回有意义的值,需要注意其适用场景fmt.Println(ret.LastInsertId())
}

在这里插入图片描述

func delData(context *gin.Context) {// 从HTTP请求的查询参数中获取需要删除的用户的名称name := context.Query("name")// 定义一个整型变量count,用于存储数据库查询返回的计数结果var count int// 定义SQL查询字符串,用于检查具有特定名称的用户是否存在于数据库中sqlStr := "select count(*) from user where name=?"// 执行SQL查询,将查询结果(即用户的数量)存储于变量count中err := sqlDb.QueryRow(sqlStr, name).Scan(&count)// 如果查询结果显示用户数量为0或查询时发生错误,则向客户端发送数据不存在的响应if count <= 0 || err != nil {sqlResponse.Code = http.StatusBadRequestsqlResponse.Message = "删除的数据不存在"sqlResponse.Data = "error"context.JSON(http.StatusOK, sqlResponse)return}// 定义SQL删除字符串,用于从数据库中删除具有特定名称的用户delStr := "delete from user where name=?"// 执行SQL删除操作ret, err := sqlDb.Exec(delStr, name)// 如果在执行删除操作时发生错误,则向客户端发送删除失败的响应if err != nil {sqlResponse.Code = http.StatusBadRequestsqlResponse.Message = "删除的数据不存在"sqlResponse.Data = "error"context.JSON(http.StatusOK, sqlResponse)return}// 如果删除成功,向客户端发送删除成功的响应sqlResponse.Code = http.StatusOKsqlResponse.Message = "删除成功"sqlResponse.Data = "OK"context.JSON(http.StatusOK, sqlResponse)// 打印到控制台SQL操作返回的结果,这通常用于调试// 注意:这里的LastInsertId()在删除操作中可能不会返回有意义的值,因为它更适用于插入操作fmt.Println(ret.LastInsertId())
}

在这里插入图片描述

xorm框架

package mainimport ("fmt""github.com/gin-gonic/gin"_ "github.com/go-sql-driver/mysql" // 导入MySQL驱动"github.com/go-xorm/xorm""net/http""time"
)var x *xorm.Engine
var xormResponse XormResponsetype Stu struct {Id      int64     `xorm:"pk autoincr" json:"id"`StuNum  string    `xorm:"unique" json:"stu_num"`Name    string    `json:"name"`Age     int       `json:"age"`Created time.Time `xorm:"created" json:"created"`Updated time.Time `xorm:"updated" json:"updated"`
}type XormResponse struct {Code    int         `json:"code"`    // 响应状态码Message string      `json:"message"` // 响应消息Data    interface{} `json:"data"`    // 响应数据
}
func init() {sqlStr := "root:123456@tcp(127.0.0.1:3306)/xorm?charset=utf8&parseTime=true&loc=Local"var err errorx, err = xorm.NewEngine("mysql", sqlStr)if err != nil {fmt.Println("数据库连接失败", err)return}err = x.Sync(new(Stu))if err != nil {fmt.Println("数据库同步错误", err)return}fmt.Println("数据库初始化成功", err)
}
func main() {r := gin.Default()r.POST("/xorm/insert", insertData)r.GET("/xorm/read", readData)r.GET("/xorm/mulread", mulReadData)r.PUT("/xorm/update", xormUpdateData)r.DELETE("/xorm/del", delData)r.Run(":9090")
}
func insertData(context *gin.Context) {var s Stuerr := context.Bind(&s)if err != nil {xormResponse.Code = http.StatusBadRequestxormResponse.Message = "参数错误"xormResponse.Data = "error"context.JSON(http.StatusOK, xormResponse)return}affected, err := x.Insert(s)if affected <= 0 || err != nil {xormResponse.Code = http.StatusBadRequestxormResponse.Message = "写入失败"xormResponse.Data = "error"context.JSON(http.StatusOK, xormResponse)return}xormResponse.Code = http.StatusOKxormResponse.Message = "写入成功"xormResponse.Data = "OK"context.JSON(http.StatusOK, xormResponse)
}

在这里插入图片描述

func readData(context *gin.Context) {stuNum := context.Query("stu_num")var stus []Stuerr := x.Where("stu_num=?", stuNum).Find(&stus)if err != nil {xormResponse.Code = http.StatusBadRequestxormResponse.Message = "查询错误"xormResponse.Data = "error"context.JSON(http.StatusOK, xormResponse)return}xormResponse.Code = http.StatusOKxormResponse.Message = "查询成功"xormResponse.Data = stuscontext.JSON(http.StatusOK, xormResponse)
}

在这里插入图片描述

func mulReadData(context *gin.Context) {name := context.Query("name")var stus []Stuerr := x.Where("name=?", name).And("age>20").Limit(10, 0).Asc("age").Find(&stus)if err != nil {xormResponse.Code = http.StatusBadRequestxormResponse.Message = "查询错误"xormResponse.Data = "error"context.JSON(http.StatusOK, xormResponse)return}xormResponse.Code = http.StatusOKxormResponse.Message = "查询成功"xormResponse.Data = stuscontext.JSON(http.StatusOK, xormResponse)
}

在这里插入图片描述

func xormUpdateData(context *gin.Context) {var s Stuerr := context.Bind(&s)if err != nil {xormResponse.Code = http.StatusBadRequestxormResponse.Message = "参数错误"xormResponse.Data = "error"context.JSON(http.StatusOK, xormResponse)return}var stus []Stuerr = x.Where("stu_num=?", s.StuNum).Find(&stus)if err != nil || len(stus) <= 0 {xormResponse.Code = http.StatusBadRequestxormResponse.Message = "数据不存在"xormResponse.Data = "error"context.JSON(http.StatusOK, xormResponse)return}affected, err := x.Where("stu_num=?", s.StuNum).Update(&Stu{Name: s.Name, Age: s.Age})if err != nil || affected <= 0 {xormResponse.Code = http.StatusBadRequestxormResponse.Message = "修改失败"xormResponse.Data = "error"context.JSON(http.StatusOK, xormResponse)return}xormResponse.Code = http.StatusBadRequestxormResponse.Message = "修改成功"xormResponse.Data = "OK"context.JSON(http.StatusOK, xormResponse)
}

在这里插入图片描述

func delData(context *gin.Context) {stuNum := context.Query("stu_num")var stus []Stuerr := x.Where("name=?", stuNum).Find(&stus)if err != nil {xormResponse.Code = http.StatusBadRequestxormResponse.Message = "没有此条数据"xormResponse.Data = "error"context.JSON(http.StatusOK, xormResponse)return}affected, err := x.Where("stu_num=?", stuNum).Delete(&Stu{})if err != nil || affected <= 0 {xormResponse.Code = http.StatusBadRequestxormResponse.Message = "删除失败"xormResponse.Data = "error"context.JSON(http.StatusOK, xormResponse)return}xormResponse.Code = http.StatusBadRequestxormResponse.Message = "删除成功"xormResponse.Data = "OK"context.JSON(http.StatusOK, xormResponse)
}

在这里插入图片描述

gorm框架

package mainimport ("fmt""github.com/gin-gonic/gin""gorm.io/driver/mysql""gorm.io/gorm""net/http""time"
)type Product struct {ID             int       `gorm:"primaryKey;autoIncrement" json:"id"`Number         string    `gorm:"unique" json:"number"`Category       string    `gorm:"type:varchar(256);not null" json:"category"`Name           string    `gorm:"type:varchar(20);not null" json:"name"`MadeIn         string    `gorm:"type:varchar(128);not null" json:"madeIn"`ProductionTime time.Time `json:"production_time"`
}type GormResponse struct {Code    int         `json:"code"`    // 响应状态码Message string      `json:"message"` // 响应消息Data    interface{} `json:"data"`    // 响应数据
}var gormResponse GormResponsevar gormDB *gorm.DB
func init() {var err errorsqlStr := "root:123456@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=true&loc=Local"gormDB, err = gorm.Open(mysql.Open(sqlStr), &gorm.Config{})if err != nil {fmt.Println("数据库连接失败", err)return}
}func main() {r := gin.Default()r.POST("/gorm/insert", insetData)r.GET("/gorm/read", readData)r.GET("/gorm/readAll", readAllData)r.PUT("/gorm/update", updateData)r.DELETE("/gorm/del", delData)r.Run(":9090")
}
func errorTouch(context *gin.Context) {defer func() {err := recover()if err != nil {gormResponse.Code = http.StatusBadRequestgormResponse.Message = "错误"gormResponse.Data = errcontext.JSON(http.StatusOK, gormResponse)}}()
}
func insetData(context *gin.Context) {errorTouch(context)var p Producterr := context.Bind(&p)if err != nil {gormResponse.Code = http.StatusBadRequestgormResponse.Message = "参数错误"gormResponse.Data = errcontext.JSON(http.StatusOK, gormResponse)return}tx := gormDB.Create(&p)if tx.RowsAffected <= 0 {gormResponse.Code = http.StatusBadRequestgormResponse.Message = "写入失败"gormResponse.Data = "error"context.JSON(http.StatusBadRequest, gormResponse)return}gormResponse.Code = http.StatusOKgormResponse.Message = "写入成功"gormResponse.Data = "ok"context.JSON(http.StatusOK, gormResponse)
}

在这里插入图片描述

func readData(context *gin.Context) {errorTouch(context)number := context.Query("number")product := Product{}tx := gormDB.Where("number=?", number).First(&product)if tx.Error != nil {gormResponse.Code = http.StatusBadRequestgormResponse.Message = "查询错误"gormResponse.Data = tx.Errorcontext.JSON(http.StatusOK, gormResponse)return}gormResponse.Code = http.StatusBadRequestgormResponse.Message = "查询成功"gormResponse.Data = productcontext.JSON(http.StatusOK, gormResponse)
}

在这里插入图片描述

func readAllData(context *gin.Context) {category := context.Query("category")products := make([]Product, 10)tx := gormDB.Where("category=?", category).Find(&products).Limit(10)if tx.Error != nil {gormResponse.Code = http.StatusBadRequestgormResponse.Message = "查询错误"gormResponse.Data = tx.Errorcontext.JSON(http.StatusOK, gormResponse)return}gormResponse.Code = http.StatusOKgormResponse.Message = "查询成功"gormResponse.Data = productscontext.JSON(http.StatusOK, gormResponse)
}

在这里插入图片描述

func updateData(context *gin.Context) {errorTouch(context)var p Producterr := context.Bind(&p)if err != nil {gormResponse.Code = http.StatusBadRequestgormResponse.Message = "参数错误"gormResponse.Data = errcontext.JSON(http.StatusOK, gormResponse)return}var count int64gormDB.Model(&Product{}).Where("number=?", p.Number).Count(&count)if count <= 0 {gormResponse.Code = http.StatusBadRequestgormResponse.Message = "数据不存在"gormResponse.Data = "error"context.JSON(http.StatusOK, gormResponse)return}tx := gormDB.Model(&Product{}).Where("number=?", p.Number).Updates(&p)if tx.RowsAffected <= 0 {gormResponse.Code = http.StatusBadRequestgormResponse.Message = "写入失败"gormResponse.Data = "error"context.JSON(http.StatusOK, gormResponse)return}gormResponse.Code = http.StatusOKgormResponse.Message = "更新成功"gormResponse.Data = "ok"context.JSON(http.StatusOK, gormResponse)
}

在这里插入图片描述

func delData(context *gin.Context) {errorTouch(context)number := context.Query("number")var count int64gormDB.Model(&Product{}).Where("number=?", number).Count(&count)if count <= 0 {gormResponse.Code = http.StatusBadRequestgormResponse.Message = "数据不存在"gormResponse.Data = "error"context.JSON(http.StatusOK, gormResponse)return}tx := gormDB.Where("number=?", number).Delete(&Product{})if tx.RowsAffected <= 0 {gormResponse.Code = http.StatusBadRequestgormResponse.Message = "删除失败"gormResponse.Data = "error"context.JSON(http.StatusOK, gormResponse)return}gormResponse.Code = http.StatusOKgormResponse.Message = "删除成功"gormResponse.Data = "ok"context.JSON(http.StatusOK, gormResponse)
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/17752.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML 页面布局

慢慢生活&#xff0c;慢慢变好 —— 24.5.28 页面布局 盒子: 页面中所有的元素(标签)&#xff0c;都可以看做是一个盒子&#xff0c;由盒子将页面中的元素包含在一个矩形区域内&#xff0c;通过盒子的视角更方便的进行页面布局 盒子模型组成: 内容区域(content)、内边距区域(pa…

数据结构的希尔排序(c语言版)

一.希尔排序的概念 1.希尔排序的基本思想 希尔排序是一种基于插入排序算法的优化排序方法。它的基本思想如下: 选择一个增量序列 t1&#xff0c;t2&#xff0c;......&#xff0c;tk&#xff0c;其中 ti > tj, 当 i < j&#xff0c;并且 tk 1。 按增量序列个数k&#…

Centos安装,window、ubuntus双系统基础上安装Centos安装

文章目录 前言一、准备工作二、开始安装1、2、首先选择DATE&TIME2、选择最小安装3、 选择安装位置 总结 前言 因工作需要&#xff0c;我需要在工控机上额外装Centos7系统&#xff0c;不过我是装在机械硬盘上了不知道对性能是否有影响&#xff0c;若有影响&#xff0c;后面…

基于C#开发web网页管理系统模板流程-主界面管理员入库和出库功能完善

前言 紧接上篇->基于C#开发web网页管理系统模板流程-主界面管理员录入和编辑功能完善-CSDN博客 本篇将完善主界面的管理员入库和出库功能&#xff0c;同样的&#xff0c;管理员入库和出库的设计套路适用于动态表的录入和编辑 首先还是介绍一下本项目将要实现的功能 &#xf…

[Android]项目打包APK时报错PKCS12 keystore not in version 3 format

报错&#xff1a; PKCS12 keystore not in version 3 format Execution failed for task :app:packageRelease. > A failure occurred while executing com.android.build.gradle.tasks.PackageAndroidArtifact$IncrementalSplitterRunnable > com.android.ide.commo…

如何为个人网站部署SSL安全证书,以实现网站的 HTTPS 加密协议访问?

哈喽&#xff0c;大家好呀&#xff01;这里是码农后端。完成了域名的备案与解析后&#xff0c;就可以通过域名来访问我们的网站了。本篇将介绍如何为我们的网站部署SSL安全证书&#xff0c;实现网站的 HTTPS 加密协议访问。 1、购买SSL证书 未进行SSL证书部署&#xff0c;访问网…

回答篇二:测试开发高频面试题目

引用之前文章&#xff1a;测试开发高频面试题目 本篇文章是回答篇&#xff08;持续更新中&#xff09; 1. 在测试开发中使用哪些自动化测试工具和框架&#xff1f;介绍一下你对其中一个工具或框架的经验。 a. 测试中经常是用的自动化测试工具和框架有Selenium、Pytest、Postman…

调整表格大小

方法一&#xff1a;使用鼠标拖动表格边框或右下角的调整控点 在Word文档中&#xff0c;选中要缩小的表格&#xff0c;将鼠标指针放在表格的边框线上&#xff0c;直到指针变成双箭头的形状。 按住鼠标左键&#xff0c;拖动边框线&#xff0c;调整表格的宽度或高度。如果同时按住…

AI视频教程下载:使用ChatGPT进行商务写作

你将学到什么&#xff1f; 学习如何将ChatGPT集成到你的写作过程中&#xff0c;并有效地将其用作商务写作的个人写作助手。 学习如何使用ChatGPT生成想法&#xff0c;提高你的书面沟通的结构、清晰度和连贯性。 你将学习使用ChatGPT的最佳实践&#xff0c;包括如何自定义其设…

Win10版本TDengine使用分享

软件介绍 TDengine是一款开源、高性能、可扩展的时间序列数据库&#xff08;TSDB&#xff09;。它由涛思数据公司开发&#xff0c;专为处理大规模时间序列数据而设计。时间序列数据是指按时间顺序排列的数据点序列&#xff0c;广泛应用于物联网、大数据分析、金融等领域。TDen…

Redis解决缓存一致性问题

文章目录 ☃️概述☃️数据库和缓存不一致采用什么方案☃️代码实现☃️其他 ☃️概述 由于我们的 缓存的数据源来自于数据库, 而数据库的 数据是会发生变化的, 因此,如果当数据库中 数据发生变化,而缓存却没有同步, 此时就会有 一致性问题存在, 其后果是: 用户使用缓存中的过…

DSP6657 GPIO中断学习

1 简介 使用创龙板卡的KEY2按键通过中断的方式控制LED3的亮灭 2 中断学习 在C665x设备上&#xff0c;CPU中断是通过C66x CorePac中断控制器进行配置的。该中断控制器允许最多128个系统事件被编程到任意12个CPU可屏蔽中断输入&#xff08;CPUINT4至CPUINT15&#xff09;、CPU…

短剧解说一键生成原创文案的快速方法

如今短剧创作火的一塌糊涂&#xff0c;它们以其简洁明了的剧情、生动有趣的角色和紧凑的节奏&#xff0c;吸引了大量观众的关注。因此&#xff0c;它所带来的流量是非常巨大&#xff0c;不少人将流量的获取瞄准了短剧创作领域以及短剧解说领域。而对于短剧解说人员来讲&#xf…

微服务项目收获和总结---第5天(定时发布)

延迟任务 目录 延迟任务技术对比&#xff1a; Redis实现定时任务&#xff1a;​编辑新增任务&#xff1a;取消任务&#xff1a;拉取任务&#xff1a;Zset定时刷新数据到List中&#xff1a;分布式锁实现定时任务只刷新一次&#xff1a; 技术对比&#xff1a; Redis实现定时任…

香橙派 AIpro 昇腾 Ascend C++ 分类模型适配

香橙派 AIpro 昇腾 Ascend C 分类模型适配 flyfish 文章目录 香橙派 AIpro 昇腾 Ascend C 分类模型适配前言一、PyTorch官网resnet模型处理方式1、PyTorch模型 导出 onnx格式2、完整测试 输出top1结果3、完整测试 输出top5结果 二、YOLOv8官网resnet模型Python处理方式三、昇腾…

云衔科技:为什么推荐使用zoho crm客户管理系统?

在当今快速变化的商业环境中&#xff0c;企业对高效、智能化的客户关系管理&#xff08;CRM&#xff09;系统的需求日益增长。Zoho CRM&#xff0c;作为全球领先的企业级CRM解决方案提供商&#xff0c;凭借其全面的功能、高度的可定制性、以及无缝集成的生态系统&#xff0c;成…

探寻导师:2024年最新研究生导师评价汇总

随着考研热潮的不断升温&#xff0c;对于研究生导师的选择变得愈发重要。导师不仅关系到研究生的学术成长&#xff0c;还直接影响到未来的职业发展。然而&#xff0c;如何找到一位合适的导师成为许多考生头疼的问题。为了帮助广大考生更好地选择导师&#xff0c;整理了最新最全…

Nature 正刊!瑞典于默奥大学研究团队在研究全球河流和溪流的甲烷排放中取得新进展

甲烷(CH4)是一种强有力的温室气体&#xff0c;自工业革命以来&#xff0c;其在大气中的浓度增加了两倍。有证据表明&#xff0c;全球变暖增加了淡水生态系统的 CH4 排放&#xff0c;为全球气候提供了积极的反馈。然而&#xff0c;对于河流和溪流来说&#xff0c;甲烷排放的控制…

区间类贪心,蓝桥云课 打折

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 0打折 - 蓝桥云课 (lanqiao.cn) 二、解题报告 1、思路分析 思路很简单&am…

c++(五)

c&#xff08;五&#xff09; 继承基类和派生类继承的格式继承的方式三种:public、private、protected 继承的规则多层继承多重继承 类与类的关系 继承 一个新类从已有的类那里获得其已有特性(属性、行为)&#xff0c;这种现象称为类的继承 基类和派生类 <1>从已有的类…