Go语言之GORM框架(二) ——GORM的单表操作

前言

在上一篇文章中,我们对Gorm进行了介绍,而在这一篇文章中我们主要介绍GORM的单表查询与Hook函数,在进行今天的内容之前我们先事先说明一下,下面我们对单表进行操作的表结构如下:

type Student struct {ID   uint   `gorm:"size:3"`Name string `gorm:"size:8"`Age  int    `gorm:"size:3"`Sex  string `gorm:"size:3"`Email *string `gorm:"size:32"`
}

好了,话不多说,开始我们今天的内容

表的初始化

在这里插入图片描述
首先我们确定一下我们已经将要演示的数据库内相关内容清空掉了,然后我们就可以开始连接数据库并创建students表了:

package mainimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm"
)type Student struct {ID    uint    `gorm:"size:3"`Name  string  `gorm:"size:8"`Age   int     `gorm:"size:3"`Sex   string  `gorm:"size:3"`Email *string `gorm:"size:32"`
}var myDB *gorm.DBfunc init() {user := "root"password := "aaaa"dbname := "gorm"ip := "127.0.0.1"port := "3306"dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", user, password, ip, port, dbname)db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {fmt.Println("数据库连接失败,err:", err)return}fmt.Println("数据库连接成功")myDB = db
}func main() {err := myDB.AutoMigrate(&Student{})if err != nil {fmt.Println("students表创建失败,err:", err)return}fmt.Println("students表创建成功")
}

在这里插入图片描述

单表操作

创建并插入数据

插入单条数据

func SingleInsert(student Student) {res := myDB.Create(&student)if res.Error != nil {fmt.Println("插入数据失败,err:", res.Error)return}fmt.Println("插入数据成功")
}func main() {err := myDB.AutoMigrate(&Student{})if err != nil {fmt.Println("students表创建失败,err:", err)return}fmt.Println("students表创建成功")email := "fengxu@163.com"student := Student{Name:  "fengxu",Age:   18,Sex:   "男",Email: &email,}SingleInsert(student)
}

运行成功,查找数据库:
在这里插入图片描述
这样我们就成功将一条记录插入数据库了

批量插入数据

func Insert(StudentList []Student) {var StudentList []Studentfor i := 0; i < 10; i++ {email := fmt.Sprintf("No.%d@163.com", i)student := Student{Name:  fmt.Sprintf("No.%d", i),Age:   18 + i,Sex:   "男",Email: &email,}StudentList = append(StudentList, student)}res := myDB.Create(&StudentList)if res.Error != nil {fmt.Println("插入数据失败,err:", res.Error)return}fmt.Println("插入数据成功")
}

在这里插入图片描述
这显示我们成功向students表中批量插入数据。

插入数据的细节

  • 这里的email我为了表示它可以为空,将它的类型设置成了指针,所以我们在传值的时候也要传指针
  • 我们在使用Create函数时,传递的是指针,而不是具体值
  • 由于我们传入到Create函数的是student的指针,所以student在此之后就会出现该记录的其他消息了,比如下面这样:
func SingleInsert(student Student) {//插入单条数据email := "fengxu@163.com"student := Student{Name:  "luoyu",Age:   18,Sex:   "男",Email: &email,}SingleInsert(student)res := myDB.Create(&student)if res.Error != nil {fmt.Println("插入数据失败,err:", res.Error)return}fmt.Println("插入数据成功")fmt.Println(student)
}

打印的结果为:

{13 luoyu 180xc0001e0830}

单表插入的完整代码:

package mainimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm"
)type Student struct {ID    uint    `gorm:"size:3"`Name  string  `gorm:"size:8"`Age   int     `gorm:"size:3"`Sex   string  `gorm:"size:3"`Email *string `gorm:"size:32"`
}var myDB *gorm.DBfunc init() {user := "root"password := "ba161754"dbname := "gorm"ip := "127.0.0.1"port := "3306"dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", user, password, ip, port, dbname)db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {fmt.Println("数据库连接失败,err:", err)return}fmt.Println("数据库连接成功")myDB = db
}func SingleInsert(student Student) {res := myDB.Create(&student)if res.Error != nil {fmt.Println("插入数据失败,err:", res.Error)return}fmt.Println("插入数据成功")fmt.Println(student)
}func Insert(StudentList []Student) {res := myDB.Create(&StudentList)if res.Error != nil {fmt.Println("插入数据失败,err:", res.Error)return}fmt.Println("插入数据成功")
}func main() {err := myDB.AutoMigrate(&Student{})if err != nil {fmt.Println("students表创建失败,err:", err)return}fmt.Println("students表创建成功")//插入单条数据email := "fengxu@163.com"student := Student{Name:  "luoyu",Age:   18,Sex:   "男",Email: &email,}SingleInsert(student)//批量插入数据var StudentList []Studentfor i := 0; i < 10; i++ {email := fmt.Sprintf("No.%d@163.com", i)student := Student{Name:  fmt.Sprintf("No.%d", i),Age:   18 + i,Sex:   "男",Email: &email,}StudentList = append(StudentList, student)}Insert(StudentList)
}

单表查询

前言

在讲解单表查询之前,我们先来看一个很简单的单表查询代码

package mainimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm""gorm.io/gorm/logger""log""os""time"
)type Student struct {ID    uint    `gorm:"size:3"`Name  string  `gorm:"size:8"`Age   int     `gorm:"size:3"`Sex   string  `gorm:"size:3"`Email *string `gorm:"size:32"`
}var myDB *gorm.DB
var mysqllogger logger.Interfacefunc init() {user := "root"password := "ba161754"dbname := "gorm"ip := "127.0.0.1"port := "3306"dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", user, password, ip, port, dbname)db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {fmt.Println("数据库连接失败,err:", err)return}fmt.Println("数据库连接成功")myDB = db
}func initLogger() {var mysqlLogger logger.InterfacemysqlLogger = logger.Default.LogMode(logger.Info) //设置日志打印级别mysqlLogger = logger.New(log.New(os.Stdout, "\r\n", log.LstdFlags), // (日志输出的目标,前缀和日志包含的内容)logger.Config{SlowThreshold:             time.Second, // 慢 SQL 阈值LogLevel:                  logger.Info, // 日志级别IgnoreRecordNotFoundError: true,        // 忽略ErrRecordNotFound(记录未找到)错误Colorful:                  true,        // 使用彩色打印},)myDB.Logger = mysqlLogger
}func main() {var student StudentinitLogger()myDB.Session(&gorm.Session{Logger: mysqllogger,})myDB.Take(&student) //默认查找第一条数据fmt.Println(student)student = Student{}myDB.First(&student) //查找第一条数据fmt.Println(student)student = Student{}myDB.Last(&student) //查找最后一条数据fmt.Println(student)
}

输出结果为:
在这里插入图片描述
这里我在打印出查询结果的同时也打印出了它们原生的sql语句,我们可以看到相对于原生sql语句,GORM的语句相对比较简单。

当然和我们平时利用各种各样的筛选条件来进行查询,我们在GORM也可以利用各种各样的条件来完成查询,,最后我们介绍一下下面我们可能会使用的函数:

  • Take:用于从数据库中检索符合条件的第一条记录,并将其填充到指定的结构体中。如果没有指定特定的条件,它会默认返回第一条记录。
  • Find:用于从数据库中检索符合条件的所有记录,并将它们填充到指定的结构体切片中。你可以使用Where函数来添加条件限制,以便只检索满足特定条件的记录。

单条记录查询

  • 根据主键查询
	myDB.Take(&student, 1)fmt.Println(student)myDB.Take(&student, "1")fmt.Println(student)

注意:这里指定主键时可以是数字也可以是字符串

  • 根据其他条件来查询
	myDB.Take(&student, "name = ?", "fengxu")fmt.Println(student)

这里我们用?来作为占位符,这样可以有效的防止sql注入

  • 根据struct来查询
	myDB.Where(&Student{Name: "fengxu"}).Find(&student)fmt.Println(student)student = Student{}
  • 获取查询结果
	var studentList []Studenterr := myDB.Find(&studentList).Errorswitch {case errors.Is(err, gorm.ErrRecordNotFound):fmt.Println("没有找到数据")default:fmt.Println("sql语句出现问题")}count := myDB.Find(&studentList).RowsAffected  //获取查询结果条数fmt.Println(count)
}

完整代码:

func SingleSerach() {var student Studentvar studentList []Student//根据主键查询myDB.Take(&student, 1)fmt.Println(student)student = Student{}myDB.Take(&student, "3")fmt.Println(student)student = Student{}//根据字段查询myDB.Take(&student, "name = ?", "fengxu")fmt.Println(student)student = Student{}//根据struct来查询//student.ID = 4myDB.Where(&Student{Name: "fengxu"}).Find(&student)fmt.Println(student)student = Student{}err := myDB.Find(&studentList).Errorswitch {case errors.Is(err, gorm.ErrRecordNotFound):fmt.Println("没有找到数据")default:fmt.Println("sql语句出现问题")}count := myDB.Find(&studentList).RowsAffectedfmt.Println(count)
}

多条记录查询

  • 简单示例:
func MultipleSearch() {var studentList []StudentmyDB.Find(&studentList)for _, v := range studentList {fmt.Println(v)}//上面我们打印的email是地址,我们需要对它进行序列化for _, v := range studentList {data, _ := json.Marshal(v)fmt.Println(string(data))}
}
  • 按照主键来查询
	studentList1 := []Student{}myDB.Find(&studentList1, 1, 2, 3, 4, 5, 6)for _, v := range studentList1 {data, _ := json.Marshal(v)fmt.Println(string(data))}studentList2 := []Student{}myDB.Find(&studentList2, []int{1, 2, 3, 4, 5, 6})for _, v := range studentList2 {data, _ := json.Marshal(v)fmt.Println(string(data))}

注意:这里其实用不用前片都可以,但是测试结果是切片速度明显较快,建议使用切片

  • 按照其他条件来查询
	//根据字段查询studentList := []Student{}myDB.Where("name in ?", []string{"fengxu", "luoyu"}).Find(&studentList)for _, v := range studentList {data, _ := json.Marshal(v)fmt.Println(string(data))}

全部代码:

func MultipleSearch() {var studentList []StudentmyDB.Find(&studentList)for _, v := range studentList {fmt.Println(v)}//按主键查询studentList1 := []Student{}myDB.Find(&studentList1, 1, 2, 3, 4, 5, 6)for _, v := range studentList1 {data, _ := json.Marshal(v)fmt.Println(string(data))}studentList2 := []Student{}myDB.Find(&studentList2, []int{1, 2, 3, 4, 5, 6})for _, v := range studentList2 {data, _ := json.Marshal(v)fmt.Println(string(data))}//根据字段查询studentList = []Student{}myDB.Where("name in ?", []string{"fengxu", "luoyu"}).Find(&studentList)for _, v := range studentList {data, _ := json.Marshal(v)fmt.Println(string(data))}
}

单表数据的更新

示例:

func Update() {var student StudentmyDB.Take(&student, 1)student.Name = "三玖"student.Sex = "女"myDB.Save(&student)fmt.Println(student)
}

注意:

  • Save会保留所有的字段,哪怕我们将字段的值设为0
  • Save函数其实是一个组合操作,如果当前不存在该字段,则是执行Create否则执行Update
  • 不要将 SaveModel一同使用, 这是 未定义的行为

单列更新

  • 更新单列指定字段
	//更新指定字段student = Student{}myDB.Take(&student)student.Age = 19myDB.Select("age").Save(&student)fmt.Println(student)
  • 批量更新
	//同时更新单个指定字段studentList := []Student{}myDB.Where("name like ?", "No.%").Find(&studentList).Update("age", 19)for _, v := range studentList {fmt.Println(v.Name, v.Age)}//同时更新多个指定字段Email := "sanjiu@163.com"new_student := Student{Age:   20,Sex:   "女",Email: &Email,}myDB.Model(&student).Where("name=?", "三玖").Updates(new_student)  //方法一:structmyDB.Model(&student).Where("name=?", "三玖").Updates(map[string]interface{}{"age":   20,"sex":   "女","email": "sanjiu@163.com",})//  方法二:map

注意:Updates函数在struct方法更新字段时会自动忽略零值,如果想避免建议使用map或使用Select函数说明一下要更新的字段,示例如下:

DB.Model(&Student{}).Where("age = ?", 21).Select("gender", "email").Updates(Student{Email:  &email,Gender: false,
})

单表删除

func Delete() {var student Studentvar studentlist []StudentmyDB.Take(&student, 1)myDB.Delete(&student) //单行删除myDB.Take(&studentlist, []int{1, 2, 3})myDB.Delete(&studentlist) //批量删除
}

代码汇总

以上有关单表操作的全部代码:

package mainimport ("encoding/json""errors""fmt""gorm.io/driver/mysql""gorm.io/gorm""gorm.io/gorm/logger""log""os""time"
)type Student struct {ID    uint    `gorm:"size:3"`Name  string  `gorm:"size:8"`Age   int     `gorm:"size:3"`Sex   string  `gorm:"size:3"`Email *string `gorm:"size:32"`
}var myDB *gorm.DB
var mysqllogger logger.Interfacefunc init() {user := "root"password := "nicai"dbname := "gorm"ip := "127.0.0.1"port := "3306"dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", user, password, ip, port, dbname)db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {fmt.Println("数据库连接失败,err:", err)return}fmt.Println("数据库连接成功")myDB = db
}func initLogger() {var mysqlLogger logger.InterfacemysqlLogger = logger.Default.LogMode(logger.Info) //设置日志打印级别mysqlLogger = logger.New(log.New(os.Stdout, "\r\n", log.LstdFlags), // (日志输出的目标,前缀和日志包含的内容)logger.Config{SlowThreshold:             time.Second, // 慢 SQL 阈值LogLevel:                  logger.Info, // 日志级别IgnoreRecordNotFoundError: true,        // 忽略ErrRecordNotFound(记录未找到)错误Colorful:                  true,        // 使用彩色打印},)myDB.Logger = mysqlLogger
}func SingleSerach() {var student Studentvar studentList []Student//根据主键查询myDB.Take(&student, 1)fmt.Println(student)student = Student{}myDB.Take(&student, "3")fmt.Println(student)student = Student{}//根据字段查询myDB.Take(&student, "name = ?", "fengxu")fmt.Println(student)student = Student{}//根据struct来查询//student.ID = 4myDB.Where(&Student{Name: "fengxu"}).Find(&student)fmt.Println(student)student = Student{}err := myDB.Find(&studentList).Errorswitch {case errors.Is(err, gorm.ErrRecordNotFound):fmt.Println("没有找到数据")default:fmt.Println("sql语句出现问题")}count := myDB.Find(&studentList).RowsAffectedfmt.Println(count)
}func MultipleSearch() {var studentList []StudentmyDB.Find(&studentList)for _, v := range studentList {fmt.Println(v)}//按主键查询studentList1 := []Student{}myDB.Find(&studentList1, 1, 2, 3, 4, 5, 6)for _, v := range studentList1 {data, _ := json.Marshal(v)fmt.Println(string(data))}studentList2 := []Student{}myDB.Find(&studentList2, []int{1, 2, 3, 4, 5, 6})for _, v := range studentList2 {data, _ := json.Marshal(v)fmt.Println(string(data))}//根据字段查询studentList = []Student{}myDB.Where("name in ?", []string{"fengxu", "luoyu"}).Find(&studentList)for _, v := range studentList {data, _ := json.Marshal(v)fmt.Println(string(data))}
}func Update() {//update操作示例var student StudentmyDB.Take(&student, 1)student.Name = "三玖"student.Sex = "女"myDB.Save(&student)fmt.Println(student)//更新指定字段student = Student{}myDB.Take(&student)student.Age = 19myDB.Select("age").Save(&student)fmt.Println(student)//同时更新多列的指定字段studentList := []Student{}myDB.Where("name like ?", "No.%").Find(&studentList).Update("age", 19)for _, v := range studentList {fmt.Println(v.Name, v.Age)}//同时更新多列Email := "sanjiu@163.com"new_student := Student{Age:   20,Sex:   "女",Email: &Email,}myDB.Model(&student).Where("name=?", "三玖").Updates(new_student) //方法一:structmyDB.Model(&student).Where("name=?", "三玖").Updates(map[string]interface{}{"age":   20,"sex":   "女","email": "sanjiu@163.com",}) //  方法二:map
}func Delete() {var student Studentvar studentlist []StudentmyDB.Take(&student, 1)myDB.Delete(&student) //单行删除myDB.Take(&studentlist, []int{1, 2, 3})myDB.Delete(&studentlist) //批量删除
}func main() {//var student StudentinitLogger()myDB.Session(&gorm.Session{Logger: mysqllogger,})//myDB.Take(&student) //默认查找第一条数据//fmt.Println(student)//student = Student{}////myDB.First(&student) //查找第一条数据//fmt.Println(student)//student = Student{}////myDB.Last(&student) //查找最后一条数据//fmt.Println(student)Delete()
}

结语

上面仅仅是我基于Gorm框架学习的一些笔记,详细可以参考:
GORM官方文档

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

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

相关文章

C# WPF入门学习(四)—— 按钮控件

上期介绍了WPF的实现架构和原理&#xff0c;之后我们开始来使用WPF来学习各种控件。 一、尝试插入一个按钮&#xff08;方法一&#xff09; 1. VS2019 在界面中&#xff0c;点击工具栏中的视图&#xff0c;在下拉菜单中选择工具箱。 至于编译器中的视图怎么舒服怎么来布置&am…

肯尼亚大坝决堤反思:强化大坝安全监测的必要性

一、背景介绍 近日&#xff0c;肯尼亚发生了一起严重的大坝决堤事件。当地时间4月29日&#xff0c;肯尼亚内罗毕以北的一座大坝决堤&#xff0c;冲毁房屋和车辆。当地官员称&#xff0c;事故遇难人数已升至71人。这起事件再次提醒我们&#xff0c;大坝安全无小事&#xff0c;监…

绘唐3模型怎么放本地sd安装及模型放置位置 及云端sd部署

绘唐3模型怎么放本地sd安装及模型放置位置 及云端sd部署 资料里面授权方式&#xff1a; https://qvfbz6lhqnd.feishu.cn/wiki/CcaewIWnSiAFgokOwLycwi0Encf 云端和模型之间存在某种关联性。云端通常用于存储和管理大量数据&#xff0c;并提供计算和资源的服务。模型是对数据进…

揭秘 淘宝死店采集私信筛选,号称日赚500+

淘宝死店采集工具为电子商务创业者揭示了一个领域的新机遇&#xff0c;通过提供一系列深入分析和资源挖掘的功能&#xff0c;展现了从失败中寻找成功之道的独特方法论。以下是如何通过这种工具寻找电商平台中的隐含机会的几个关键方面&#xff1a; 分析失败的深层原因&#x…

简历–工作经历–通用

雇主将会很注意简历中的工作经历这一部分。在看完求职目标后&#xff0c;他们想了解你的历史&#xff0c;你曾在哪儿工作&#xff0c;工作了多长时间。他们想弄明白的是“你是个稳定可靠的人吗&#xff1f;”&#xff0c;“你发挥出的才能有哪些&#xff1f;”最重要的是你是否…

Java学习路线思维导图

目录 Java学习流程1.学习大纲2.Java开发中常用的DOS命令 Java入门学习思维导图 Java学习流程 通过大纲了解学习的重点&#xff0c;通过目录依次深入【注&#xff1a;Java环境的搭建百度&#xff0c;提升自己百度的能力】 1.学习大纲 学习流程如下&#xff1a; Java基础语法 …

vim操作手册

vim分为插入模式、命令模式、底行模式。 插入模式&#xff1a;编辑模式 命令模式&#xff1a;允许使用者通过命令&#xff0c;来进行文本的编辑控制 底行模式&#xff1a;用来进行让vim进行包括但不限于shell进行交互 w&#xff1a;保存 wq&am…

创新实训2024.05.26日志:服务端接口实现——用户开启多个会话

1. 概念图 类似于Kimi&#xff0c;文心一言&#xff0c;chatGPT等市面上主流的大模型&#xff0c;我们的大模型也支持同一个用户的多个会话&#xff0c;并且提供支持联系上下文给出解答的能力。 2. 基于会话的对话 在langchain chatchat这个对langchain框架进行二次封装的第三…

属于程序员的浪漫,一颗会跳动的心!!!

绘制一颗会跳动的心❤ 嘿嘿 可以说是程序员的专属浪漫了吧&#xff0c;就像点燃一颗LED灯一样&#xff1f;&#xff08;我瞎说的啊&#xff0c;大家别当真&#xff0c;我很菜的&#xff01;&#xff01;&#xff01;&#xff01;&#xff09; 程序就在下面啦&#xff0c;然…

xgboost项目实战-保险赔偿额预测与信用卡评分预测001

目录 算法代码 原理 算法流程 xgb.train中的参数介绍 params min_child_weight gamma 技巧 算法代码 代码获取方式&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1QV7nMC5ds5wSh-M9kuiwew?pwdx48l 提取码&#xff1a;x48l 特征直方图统计&#xff1a; fig, …

【Linux】进程通信实战 —— 进程池项目

送给大家一句话: 没有一颗星&#xff0c;会因为追求梦想而受伤&#xff0c;当你真心渴望某样东西时&#xff0c;整个宇宙都会来帮忙。 – 保罗・戈埃罗 《牧羊少年奇幻之旅》 &#x1f3d5;️&#x1f3d5;️&#x1f3d5;️&#x1f3d5;️&#x1f3d5;️&#x1f3d5;️ &a…

Stream流的使用

目录 一&#xff0c;Stream流 1.1 概述 1.2 Stream代码示例 二&#xff0c;Stream流的使用 2.1 数据准备 2.2 创建流对象 2.3 中间操作 filter map distinct sorted limit skip flatMap 2.4 终结操作 foreach count max&min collect 2.5 查找与匹配 a…

免费图片文字转换成文本,ocr文字识别软件免费版,真的太实用了!

截屏短视频上一段扎心文字&#xff0c;想把它发到朋友圈怎么办&#xff1f;这时候就需要一个OCR识别软件。 它就像一个聪明的小助手&#xff0c;它可以帮助电脑“看懂”书本上或者图片里的字。就像我们用眼睛看字一样&#xff0c;OCR软件用它的“眼睛”扫描图片&#xff0c;识…

【组合数学】常考试题答案

一、单项选择题&#xff08;每小题3分&#xff0c;共15分&#xff09; 1. 用3个“1”和4个“0”能组成&#xff08; &#xff09;个不同的二进制数字。 A. 35 B. 36, C. 37, D. 38 2. 整除300的正整数的个数为&#xff08;  &#xff09;。 A. 14…

Java进阶学习笔记27——StringBuilder、StringBuffer

StringBuilder&#xff1a; StringBuilder代表可变字符串对象&#xff0c;相当于一个容器&#xff0c;它里面装的字符串是可以改变的&#xff0c;就是用来操作字符串的。 好处&#xff1a; StringBuilder比String更适合做字符串的修改操作&#xff0c;效率会更高&#xff0c;…

小白入职 必要熟悉 Git / tortoiseGit 工具

1.安装Git 1.1 了解Git Git是分布式版本控制系统&#xff0c;没有中央服务器的每个人的电脑就是一个完整的版本库&#xff0c;工作时无需联网可多人协作&#xff0c;只需把各自的修改推送给对方&#xff0c;就可以互相看到对方的修改了 分布式版本控制工具管理方式&#xff…

AI崛起,掌握它,开启智能新生活!

AI崛起&#xff0c;掌握它&#xff0c;开启智能新生活&#xff01; &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &…

算法:树状数组

文章目录 面试题 10.10. 数字流的秩327. 区间和的个数315. 计算右侧小于当前元素的个数 树状数组可以理解一种数的存储格式。 面试题 10.10. 数字流的秩 假设你正在读取一串整数。每隔一段时间&#xff0c;你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。 请实现数据结构…

H5扫描二维码相关实现

H5 Web网页实现扫一扫识别解析二维码&#xff0c;就现在方法的npm包就能实现&#xff0c;在这个过程中使用过html5-qrcode 和 vue3-qr-reader。 1、html5-qrcode的使用 感觉html5-qrcode有点小坑&#xff0c;在使用的时候识别不成功还总是进入到错误回调中出现类似NotFoundExc…