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.mzph.cn/diannao/16300.shtml

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

相关文章

推荐系统学习笔记(四)--基于向量的召回

离散特征处理 离散特征&#xff1a;性别&#xff0c;国籍&#xff0c;英文单词&#xff0c;物品id&#xff0c;用户id 处理&#xff1a; 建立字典&#xff1a;eg&#xff1a;china 1 向量化&#xff1a;eg&#xff1a;one-hot /embedding&#xff08;低维稠密向量&#xf…

网络模型-BFD与网络协议联动

一、BFD:双向转发检测 双向转发检测BFD(Bidirectional Forwarding Detection)是一种全网统一的检测机制&#xff0c;用于快速检测、监控网络中链路或者IP路由的转发连通状况。 1、BFD优点: 对相邻转发引擎之间的通道提供轻负荷、快速故障检测。这些故障包括接口数据链路&#…

​✨聚梦AI绘图插件-for photoshop(基于ComfyUI) 内测版V0.1发布

&#x1f388;背景 photoshop本身是有AI生成能力的&#xff0c;不过限于种种原因&#xff0c;国内使用很不方便。 photoshop也是有AI插件的&#xff0c;不过大多安装起来比较复杂&#xff0c;或者&#xff0c;干脆就会收费。 所以我们做了一个免费的AI插件&#xff0c;期望能…

计算机毕业设计 | SpringBoot招投标 任务发布网站(附源码)

1&#xff0c;绪论 在市场范围内&#xff0c;任务发布网站很受欢迎&#xff0c;有很多开发者以及其他领域的牛人&#xff0c;更倾向于选择工作时间、工作场景更自由的零工市场寻求零散单子来补贴家用。 如今市场上&#xff0c;任务发布网站鱼龙混杂&#xff0c;用户需要找一个…

民国漫画杂志《时代漫画》第24期.PDF

时代漫画24.PDF: https://url03.ctfile.com/f/1779803-1248635000-177187?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

基于xilinx FPGA的 FFT IP使用例程说明文档(可动态配置FFT点数,可计算信号频率与幅度)

目录 1 概述2 IP examples功能3 IP 使用例程3.1 IP设置3.2 fft_demo端口3.3 例程框图3.4 仿真结果3.5 仿真验证得出的结论4 注意事项5例程位置 1 概述 本文用于讲解xilinx IP 的FFT ip examples的功能说明&#xff0c;方便使用者快速上手。 参考文档&#xff1a;《PG109》 2 …

Python数据可视化(五)

实现GUI效果 借助 matplotlib&#xff0c;除可以绘制动画内容外&#xff0c;还可以实现用户图形界面的效果&#xff0c;也就是 GUI 效果。 GUI是用户使用界面的英文单词首字母的缩写。接下来&#xff0c;我们就以模块widgets中的类RadioButtons、 Cursor 和 CheckButtons 的使用…

Wpf 使用 Prism 实战开发Day25

首页待办事项及备忘录添加功能 一.修改待办事项和备忘录逻辑处理类,即AddMemoViewModel和AddTodoViewModel 1.AddMemoViewModel 逻辑处理类&#xff0c;添加View视图数据要绑定的实体类 Model public class AddMemoViewModel :BindableBase,IDialogHostAware{public AddMemoV…

【B站 heima】小兔鲜Vue3 项目学习笔记Day03

文章目录 Home1.Home整体结构搭建和分类实现2. banner轮播图功能3. Home 面板组件封装4.新鲜好物和人气推荐实现5. 图片懒加载指令实现6. Home- product产品列表实现7. Home-GoodsItem 组件封装 一级路由1. 整体认识和路由配置2. 面包屑导航3. 一级分类 - 轮播图的实现4. 激活状…

基于Pytorch框架的深度学习EfficientNet神经网络香蕉水果成熟度识别分类系统源码

第一步&#xff1a;准备数据 4种香蕉水果成熟度数据&#xff1a;overripe&#xff0c;ripe&#xff0c;rotten&#xff0c;unripe&#xff08;过熟、熟、烂、未成熟&#xff09;&#xff0c;总共有13474张图片&#xff0c;每个文件夹单独放一种成熟度数据 第二步&#xff1a;搭…

ZEDmini使用完全指南

ZEDmini使用 ZED stereolabs 开箱测评 使用说明 ubuntu18.04nvidiacuda10 ubuntu18.04ZED SDK安装和使用 Ubuntu16.04安装NVIDIA显卡驱动 查看显卡信息 redwallredwall-G3-3500:~/catkin_ws$ lspci | grep VGA 00:02.0 VGA compatible controller: Intel Corporation Device …

sourcetree推送到git上面

官网&#xff1a;Sourcetree | Free Git GUI for Mac and Windows 下载到1次提交 下载后打开 点击跳过 下一步 名字邮箱 点击clone 把自己要上传的代码粘贴到里面去 返回点击远程->点击暂存所有 加载完毕后&#xff0c;输入提交内容提交 提交完成了 2次提交 把文件夹内的…

【java程序设计期末复习】chapter4 类和对象

类和对象 编程语言的几个发展阶段 &#xff08;1&#xff09;面向机器语言 计算机处理信息的早期语言是所谓的机器语言&#xff0c;使用机器语言进行程序设计需要面向机器来编写代码&#xff0c;即需要针对不同的机器编写诸如0101 1100这样的指令序列。 &#xff08;2&#x…

【JavaScript】文件下载

文件下载的消息格式 服务器只要在响应头中加入 Content-Disposition: attachment; filename"kxx" 即可触发浏览器的下载功能其中&#xff1a; attachment 表示附件&#xff0c;浏览器看到此字段&#xff0c;触发下载行为&#xff08;不同的浏览器下载行为有所区别&…

【二叉树】力扣OJ题

文章目录 前言1. 翻转二叉树1.1 题目1.2 解题思路1.3 代码实现1.4 时空复杂度 2. 对称二叉树2.1 题目2.2 解题思路2.3 代码实现2.4 时空复杂度 3. 平衡二叉树3.1 题目3.2 解题思路3.3 代码实现3.4 时空复杂度 结语 前言 本篇博客主要介绍二叉树的经典 OJ 题&#xff0c;题目主…

MyBatis详细教程!!(入门版)

目录 什么是MyBatis&#xff1f; MyBatis入门 1&#xff09;创建工程 2&#xff09;数据准备 3&#xff09;配置数据库连接字符串 4&#xff09;写持久层代码 5&#xff09;生成测试类 MyBatis打印日志 传递参数 MyBatis的增、删、改 增&#xff08;Insert&#xff0…

有什么普通人可以做的赚钱软件?盘点9个适合普通人长期做的软件

在这个互联网高速发展的时代&#xff0c;智能手机已经成为我们生活中不可分割的一部分。众多APP的涌现&#xff0c;使得许多朋友都在寻求通过手机赚钱的方法。 然而&#xff0c;面对市面上琳琅满目的网上赚钱APP&#xff0c;我们该如何挑选呢&#xff1f;别担心&#xff0c;今…

功率电感设计方法2:实例

文章目录 1&#xff1a;美磁的选项手册截图2&#xff1a;设计步骤2.1&#xff1a;设计需求2.2:选择磁芯材料2.3&#xff1a;选择磁芯2.4 查询 A L A_{L} AL​自感系数2.5 初算匝数2.6重新校准验算感量 3&#xff1a;后续 绕线因子4&#xff1a;日常壁纸分享 参考手册链接 1&…

普通人转行程序员,最大的困难是找不到就业方向

来百度APP畅享高清图片 大家好&#xff0c;这里是程序员晚枫&#xff0c;小破站也叫这个名。 我自己是法学院毕业后&#xff0c;通过2年的努力才转行程序员成功的。[吃瓜R] 我发现对于一个外行来说&#xff0c;找不到一个适合自己的方向&#xff0c;光靠努力在一个新的行业里…

使用Java 将字节数组转成16进制的形式

概述 在很多场景下&#xff0c;需要进行分析字节数据&#xff0c;但是我们存起来的字节数据一般都是二进制的&#xff0c;这时候就需要我们将其转成16进制的方式方便分析。比如在做音视频的时候&#xff0c;需要看下我们传输的视频h264数据中是否有对应的I帧或者B帧等数据&…