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

news2024/9/23 9:24:56

前言

在上一篇文章中,我们对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 main

import (
	"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.DB

func 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 []Student
	for 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 main

import (
	"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.DB

func 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 []Student
	for 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 main

import (
	"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.Interface

func 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.Interface
	mysqlLogger = 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 Student
	initLogger()
	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 []Student
		err := myDB.Find(&studentList).Error
	switch {
	case errors.Is(err, gorm.ErrRecordNotFound):
		fmt.Println("没有找到数据")
	default:
		fmt.Println("sql语句出现问题")
	}
	count := myDB.Find(&studentList).RowsAffected  //获取查询结果条数
	fmt.Println(count)
}

完整代码:

func SingleSerach() {
	var student Student
	var 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 = 4
	myDB.Where(&Student{Name: "fengxu"}).Find(&student)
	fmt.Println(student)
	student = Student{}

	err := myDB.Find(&studentList).Error
	switch {
	case errors.Is(err, gorm.ErrRecordNotFound):
		fmt.Println("没有找到数据")
	default:
		fmt.Println("sql语句出现问题")
	}
	count := myDB.Find(&studentList).RowsAffected
	fmt.Println(count)
}

多条记录查询

  • 简单示例:
func MultipleSearch() {
	var studentList []Student
	myDB.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 []Student
	myDB.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 Student
	myDB.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 = 19
	myDB.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)  //方法一:struct
	
	myDB.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 Student
	var studentlist []Student
	myDB.Take(&student, 1)
	myDB.Delete(&student) //单行删除

	myDB.Take(&studentlist, []int{1, 2, 3})
	myDB.Delete(&studentlist) //批量删除
}

代码汇总

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

package main

import (
	"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.Interface

func 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.Interface
	mysqlLogger = 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 Student
	var 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 = 4
	myDB.Where(&Student{Name: "fengxu"}).Find(&student)
	fmt.Println(student)
	student = Student{}

	err := myDB.Find(&studentList).Error
	switch {
	case errors.Is(err, gorm.ErrRecordNotFound):
		fmt.Println("没有找到数据")
	default:
		fmt.Println("sql语句出现问题")
	}
	count := myDB.Find(&studentList).RowsAffected
	fmt.Println(count)
}

func MultipleSearch() {
	var studentList []Student
	myDB.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 Student
	myDB.Take(&student, 1)
	student.Name = "三玖"
	student.Sex = "女"
	myDB.Save(&student)
	fmt.Println(student)

	//更新指定字段
	student = Student{}
	myDB.Take(&student)
	student.Age = 19
	myDB.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) //方法一:struct

	myDB.Model(&student).Where("name=?", "三玖").Updates(map[string]interface{}{
		"age":   20,
		"sex":   "女",
		"email": "sanjiu@163.com",
	}) //  方法二:map
}

func Delete() {
	var student Student
	var studentlist []Student
	myDB.Take(&student, 1)
	myDB.Delete(&student) //单行删除

	myDB.Take(&studentlist, []int{1, 2, 3})
	myDB.Delete(&studentlist) //批量删除
}

func main() {
	//var student Student
	initLogger()
	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.coloradmin.cn/o/1698590.html

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

相关文章

贪心-AcWing 1522. 排成最小的数字-XMUOJ石板序列

题目 思路 getline() 是 C 标准库中的一个函数&#xff0c;用于从输入流中读取一行文本&#xff0c;并将其存储为字符串。它可以从标准输入、文件流、字符串流等不同类型的输入流中读取数据。C中istringstream、ostringstream、stringstream详细介绍和使用_c istringstream-CS…

智能合约语言(eDSL)—— 并行化方案 2

这个并行算法最初其实是在aptos上实现的&#xff0c;aptos上使用的是move虚拟机&#xff0c;后来我把它移植到我们链上了&#xff0c;但是wasm虚拟机。还是费了不少事情。 目前evm并行也比较火&#xff0c;像monad&#xff0c;sei等。经过调研发现&#xff0c;其实evm的并行&am…

代码随想录|Day42|动态规划 part07|● 70. 爬楼梯 (进阶)● 322. 零钱兑换 ● 279.完全平方数

70. 爬楼梯 &#xff08;进阶&#xff09; 322. 零钱兑换 class Solution: def climbStairs(self, n: int) -> int: if n < 1: return n dp [0] * (n 1) dp[0] 0 dp[1] 1 dp[2] 2 for i in range(3, n 1): dp[i] dp[i - 1] dp[i - 2] return dp[n] 279.完全平方数…

spring状态机实战

一、什么是状态机 状态机是有限状态自动机的简称&#xff0c;是现实事物运行规则抽象而成的一个数学模型&#xff0c;是一种概念性机器&#xff0c;它能采取某种操作来响应一个外部事件。这种操作不仅能取决于接收到的事件&#xff0c;还能取决于各个事件的相对发生顺序。状态…

Mybase长久破解

1、软件下载好之后&#xff0c;找到文件mybase8.ini文件 2、使用记事本打开&#xff0c;通过 Ctrl F 输入快速找到属性设置FirstUseOn.UserLic.App&#xff0c;将等号后面的数值删掉保存即可 3、使用防护中心–>自定义防护&#xff08;记得开启&#xff09; 4、添加规则…

深入JVM元空间以及弹性伸缩机制

个人博客 深入JVM元空间以及弹性伸缩机制 | iwts’s blog JVM内存模型中元空间所在位置 即在JVM运行时的内存模型。总体上有这样的图&#xff1a; 元空间 上面的图其实有点不太准。方法区本质上只是JVM的一个标准&#xff0c;不同JVM在不同版本下都可能有不同的实现&#x…

Java进阶学习笔记28——StringJoiner

Java中&#xff0c;有没有即能高效&#xff0c;又能实现更方便的拼接呢&#xff1f; StringJoiner&#xff1a; JDK8才开始的&#xff0c;跟StringBuilder一样&#xff0c;也是用来操作字符串的&#xff0c;也可以看成是一个容器&#xff0c;创建之后里面的内容是可变的。 好…

动态路由实验—OSPF

动态路由协议实验-------OSPF 链路状态路由选择协议又被称为最短路径优先协议&#xff0c;它基SPF&#xff08;shortest path first &#xff09;算法 实验要求&#xff1a;各个PC之间能够互通 1.四台PC配置如下 PC1 PC2 PC3 PC4 2.配置各个交换机的口子的IP R1 <HUAWE…

文件批量重命名利器:一键轻松替换文本间内容,高效管理文件不再是难题!

在信息爆炸的时代&#xff0c;我们的电脑中堆积了无数的文件。这些文件可能包含重要的工作资料、珍贵的个人回忆或是各种学习资料。然而&#xff0c;随着文件的不断增多&#xff0c;如何高效地管理和查找这些文件成为了一个头疼的问题。 文件批量改名高手是一款专业的文件管理…

轮廓系数(Average silhouette) | 最佳聚类数的判定

1.最佳分类个数 # 辅助确定最佳聚类数 4.7*2.6 factoextra::fviz_nbclust( t(DPAU_2), kmeans, method "silhouette")在2有下降拐点&#xff0c;但是样本较多时分成2类一般意义不大。 在7时也有下降拐点。 2.查看每个分类的轮廓系数 (1) pam k5 library(cluste…

基于地理坐标的高阶几何编辑工具算法(7)——矩形绘制

文章目录 工具步骤应用场景示意图算法原理工具步骤 点击矩形绘制工具,点击三个点完成矩形绘制。 应用场景 用于在地图上快速绘制任意方向的矩形。 示意图 算法原理 点第一个点确定矩形的一个角点P1,也作为平移后的坐标原点,生成平移矩阵。点第二个点P2,确定矩形的一条边…

大学高校智能制造技术实验室,工业物联数字孪生系统,三维可视化平台

上午院方领导老师现场观摩项目验收前成果展示&#xff0c;深入了解工作情况。随后召开技术交流会&#xff0c;对我司研发团队打破常规敢先试&#xff0c;精益求精给予肯定&#xff0c;并提出指导意见。在智能制造数字孪生系统平台开发调试、数据采集过程中&#xff0c;我司成功…

ollama 使用,以及指定模型下载地址

ollama windows 使用 官网&#xff1a; https://ollama.com/ windows 指定 models 下载地址 默认会下载在C盘 &#xff0c;占用空间 在Windows系统中&#xff0c;可以通过设置环境变量OLLAMA_MODELS来指定模型文件的下载和存储路径。具体操作步骤如下&#xff1a; 1.打开系统…

JVM堆分配中TLAB分配方案

个人博客 JVM堆分配中TLAB分配方案 | iwts’s blog Java对象的内存分配过程如何保证线程安全 对象的内存分配过程中&#xff0c;主要流程是将对象的引用指向一个具体的内存区域&#xff0c;然后进行初始化操作。 但是&#xff0c;因为堆是全局共享的&#xff0c;因此在同一…

图像处理ASIC设计方法 笔记24 等价表和标记代换

(一)等价表的整理与压缩 1.1 等价关系的识别与追踪 在初步标记过程完成后,等价表的整理和压缩变得至关重要。这一阶段的首要任务是从等价表的地址1开始,对等价表进行逐个扫描。在扫描过程中,系统将检查每个临时标记是否存在等价关系。若发现等价关系,系统将执行追踪过程,…

9.js函数

函数是js复杂数据类型的一种---可以理解为存放代码的盒子 用来帮助我们封装、复用、扩展以及调用代码的工具 函数的两个阶段 &#xff08;1&#xff09;声明函数&#xff08;理解为创造&#xff09; ——声明式声明 语法&#xff1a;function 函数名(参数){...代码} ——赋值时…

for循环里如果std::pair的类型写不对,可能会造成性能损失

第一版 std::map<int, int> t;t.emplace(1, 1);for (const std::pair<int,int>& data : t){int i 0;std::ignore i;}中间留一些空格&#xff0c;是因为ms在调试的时候&#xff0c;尤其是模板比较多的时候&#xff0c;经常断点的行号有问题。比如第5行的断点&…

Linux服务的简介与分类

服务的简介与分类 服务的分类 查询已安装的服务和区分服务 #列出所有rpm包默认安装服务的自启动状态 [rootlocalhost ~]# chkconfig --list atd atd 0:关闭 1:关闭 2:关闭 3:启用 4:启用 5:启用 6:关闭 [rootlocalhost ~]# chkconfig --list sshd sshd …

从零起航,Python编程全攻略

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、Python入门之旅 二、Python进阶之道 三、Python爬虫实战 四、Python数据分析利器 五…

【已解决】在jupyter里运行torch.cuda.is_available(),显示True,在pycharm中运行却显示false。

文章目录 问题概述1、在Jupyter中GPU运行true2、在pycharm中GPU运行false3、个人解决方案仅供参考 问题概述 在jupyter里运行torch.cuda.is_available()&#xff0c;显示True&#xff0c;在pycharm中运行却显示false。原因在于jupyter 运行环境和pycharm 运行环境不同&#xf…