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

【Go学习】-01-6-数据库泛型新特性

【Go学习】-01-6-数据库泛型新特性

  • 1 数据库操作
    • 1.1 操作mysql
      • 1.1.1 Insert
      • 1.1.2 Select
      • 1.1.3 Update
      • 1.1.4 Delete
      • 1.1.5 sql事务
    • 1.2 go操作Redis
  • 2 泛型
    • 2.1 非泛型函数
    • 2.2 泛型函数
    • 2.3 泛型类型
      • 2.3.1 泛型结构体
      • 2.3.2 泛型接口
    • 2.4 泛型约束
    • 2.5 泛型切片和映射
      • 2.5.1 泛型切片
      • 2.5.2 泛型映射
    • 2.6 泛型实际应用
  • 3 workspace
    • 3.1 概念
    • 3.2 workspace案例
  • 4 模糊测试
    • 4.1概念
    • 4.2 如何使用模糊测试
    • 4.3 模糊测试常见用法
    • 4.4 自定义输入生成


1 数据库操作

1.1 操作mysql

创建go_learn数据库后创建user表

CREATE TABLE `user` (`user_id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(255) DEFAULT NULL,`sex` varchar(255) DEFAULT NULL,`email` varchar(255) DEFAULT NULL,PRIMARY KEY (`user_id`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

mysql的前置知识,我们这里就不讲了,可自行去学习mysql教程

在这里插入图片描述

1.1.1 Insert

首先,需要引入mysql驱动

通过go get github.com/go-sql-driver/mysql@v1.6.0引入依赖

_ "github.com/go-sql-driver/mysql"

我们的数据库地址是192.168.101.68:3306

用户名:root

密码:mysql

插入一条记录:名字bblb,性别man,邮箱bblb123456789@qq.com

package mainimport ("database/sql""fmt"_ "github.com/go-sql-driver/mysql""log""time"
)var DB *sql.DBfunc init() {db, err := sql.Open("mysql", "root:mysql@tcp(192.168.101.68:3306)/go_learn")if err != nil {panic(err)}//最大空闲连接数,默认不配置,是2个最大空闲连接db.SetMaxIdleConns(5)//最大连接数,默认不配置,是不限制最大连接数db.SetMaxOpenConns(100)// 连接最大存活时间db.SetConnMaxLifetime(time.Minute * 3)//空闲连接最大存活时间db.SetConnMaxIdleTime(time.Minute * 1)err = db.Ping()if err != nil {log.Println("数据库连接失败")db.Close()panic(err)}DB = db}func save() {r, err := DB.Exec("insert into user (username,sex,email) values(?,?,?)", "bblb", "man", "bblb123456789@qq.com")if err != nil {log.Println("执行sql语句出错")panic(err)}id, err := r.LastInsertId()if err != nil {panic(err)}fmt.Println("插入成功:", id)
}
func main() {defer DB.Close()save()
}

查看数据库

在这里插入图片描述

1.1.2 Select

type User struct {UserId   int    `db:"user_id"`Username string `db:"username"`Sex      string `db:"sex"`Email    string `db:"email"`
}func query(id int)  (*User,error) {rows, err := DB.Query("select * from user where user_id=? limit 1", id)if err != nil{log.Println("查询出现错误:",err)return nil,errors.New(err.Error())}user := new(User)for rows.Next() {if err := rows.Scan(&user.UserId,&user.Username,&user.Sex,&user.Email); err != nil{log.Println("scan error:",err)return nil,errors.New(err.Error())}}return user,nil
}
func main() {defer DB.Close()//save()user,err := query(2)if err != nil{log.Println("查询出现错误:",err)return}fmt.Printf("查询成功:%+v\n",user)
}

可以看到我们刚刚插入的id是2所以查2

查询成功:&{UserId:2 Username:bblb Sex:man Email:bblb123456789@qq.com}

1.1.3 Update

func update(username string, id int)  {ret, err := DB.Exec("update user set username=? where user_id=?", username, id)if err != nil {log.Println("更新出现问题:",err)return}affected, _ := ret.RowsAffected()fmt.Println("更新成功的行数:",affected)
}

1.1.4 Delete

func delete(id int)  {ret, err := DB.Exec("delete from user where user_id=?", id)if err != nil {log.Println("删除出现问题:",err)return}affected, _ := ret.RowsAffected()fmt.Println("删除成功的行数:",affected)
}

1.1.5 sql事务

mysql事务特性:

  1. 原子性
  2. 一致性
  3. 隔离性
  4. 持久性
func insertTx(username string)  {tx, err := DB.Begin()if err != nil {log.Println("开启事务错误:",err)return}ret, err := tx.Exec("insert into user (username,sex,email) values (?,?,?)", username, "man", "test@test.com")if err != nil {log.Println("事务sql执行出错:",err)return}id, _ := ret.LastInsertId()fmt.Println("插入成功:",id)if username == "lisi" {fmt.Println("回滚...")_ = tx.Rollback()}else {_ = tx.Commit()}}

1.2 go操作Redis

redis不另行介绍,默认会,如果不了解,先去学习redis教程

安装:go get github.com/go-redis/redis/v8

package mainimport ("context""fmt""github.com/go-redis/redis/v8"
)func main() {ctx := context.Background()rdb := redis.NewClient(&redis.Options{Addr:     "192.168.101.68:6379",Password: "redis", // no password setDB:       0,       // use default DB})err := rdb.Set(ctx, "key", "value", 0).Err()if err != nil {panic(err)}val, err := rdb.Get(ctx, "key").Result()if err != nil {panic(err)}fmt.Println("key", val)val2, err := rdb.Get(ctx, "key2").Result()if err == redis.Nil {fmt.Println("key2 does not exist")} else if err != nil {panic(err)} else {fmt.Println("key2", val2)}
}

在这里插入图片描述

2 泛型

2.1 非泛型函数

两个 不同类型的映射:一种用于存储值,一种用于存储值。int64float64

package mainimport "fmt"// SumInts adds together the values of m.
func SumInts(m map[string]int64) int64 {var s int64for _, v := range m {s += v}return s
}// SumFloats adds together the values of m.
func SumFloats(m map[string]float64) float64 {var s float64for _, v := range m {s += v}return s
}
func main() {// Initialize a map for the integer valuesints := map[string]int64{"first":  34,"second": 12,}// Initialize a map for the float valuesfloats := map[string]float64{"first":  35.98,"second": 26.99,}fmt.Printf("Non-Generic Sums: %v and %v\n",SumInts(ints),SumFloats(floats))
}

针对不同的类型我们都需要写对应的函数来进行求和,这是非常麻烦的

2.2 泛型函数

Go 1.18 引入了泛型(Generics),这是 Go 语言的一项重大更新。通过泛型,Go 开发者可以编写更通用、更可复用的代码,而不需要手动编写多个类型的重复代码。

为了支持这一点,将编写一个函数,在添加到其普通函数参数中。这些类型参数使 function generic,使其能够处理不同类型的参数。将使用类型参数和普通函数参数调用函数。

package mainimport "fmt"// 定义一个泛型函数,接受一个类型参数 T
func Print[T any](value T) {fmt.Println(value)
}func main() {Print(123)    // 输出: 123Print("hello") // 输出: hello
}

T 是类型参数,any 是 Go 1.18 中的类型约束,表示可以是任何类型。

在函数 Print[T any](value T) 中,T 是类型参数,表示 value 参数的类型。

可以为类型参数指定约束,使其只能是某些特定的类型。例如,限制类型参数只能是整数类型:

package mainimport "fmt"// 定义一个泛型函数,限制 T 类型为整型(int, int32, int64)
func Sum[T int | int32 | int64](a, b T) T {return a + b
}func main() {fmt.Println(Sum(1, 2))     // 输出: 3fmt.Println(Sum(int32(3), int32(4))) // 输出: 7
}

2.3 泛型类型

2.3.1 泛型结构体

泛型不仅可以用于函数,也可以用于结构体和接口。

package mainimport "fmt"// 定义一个泛型结构体,类型参数 T
type Pair[T any] struct {First  TSecond T
}func main() {// 使用泛型结构体,传入 int 类型pair1 := Pair[int]{First: 1, Second: 2}fmt.Println(pair1) // 输出: {1 2}// 使用泛型结构体,传入 string 类型pair2 := Pair[string]{First: "hello", Second: "world"}fmt.Println(pair2) // 输出: {hello world}
}

在这个例子中,Pair[T any] 是一个泛型结构体,T 代表结构体字段的类型。

2.3.2 泛型接口

package mainimport "fmt"// 定义一个泛型接口,支持多种数值类型(int, float64)
type Adder[T int | float64] interface {Add(a, b T) T
}// 泛型类型:支持任意数值类型
type NumberAdder[T int | float64] struct{}func (na NumberAdder[T]) Add(a, b T) T {return a + b
}func main() {// 使用 NumberAdder 支持 int 类型intAdder := NumberAdder[int]{}fmt.Println(intAdder.Add(3, 4)) // 输出: 7// 使用 NumberAdder 支持 float64 类型floatAdder := NumberAdder[float64]{}fmt.Println(floatAdder.Add(3.0, 4.0)) // 输出: 7.0
}

在这里,Adder[T any] 是一个泛型接口,NumberAdder 实现了这个接口。

2.4 泛型约束

泛型支持类型约束,用于指定类型参数的合法类型范围。类型约束通过 interface{} 或更具体的接口来实现。

Go 1.18 提供了一些内置的类型约束,如 any(表示任何类型)和 comparable(表示可以进行比较的类型)。

package mainimport "fmt"// 定义一个泛型函数,约束 T 为可比较类型
func Compare[T comparable](a, b T) bool {return a == b
}func main() {fmt.Println(Compare(1, 1))       // 输出: truefmt.Println(Compare("a", "b"))   // 输出: false// fmt.Println(Compare([]int{1}, []int{1}))  // 编译错误: slices are not comparable
}

在这个例子中,T comparable 限制了类型参数 T 必须是可以进行比较的类型。

2.5 泛型切片和映射

泛型在 Go 中也支持切片(slices)和映射(maps)等常见数据结构。

2.5.1 泛型切片

package mainimport "fmt"func PrintSlice[T any](s []T) {for _, v := range s {fmt.Println(v)}
}func main() {PrintSlice([]int{1, 2, 3})      // 输出: 1 2 3PrintSlice([]string{"a", "b"})  // 输出: a b
}

2.5.2 泛型映射

package mainimport "fmt"// 泛型映射,支持任意类型作为键和值
func PrintMap[K comparable, V any](m map[K]V) {for k, v := range m {fmt.Println(k, v)}
}func main() {m1 := map[string]int{"a": 1, "b": 2}PrintMap(m1) // 输出: a 1  b 2m2 := map[int]string{1: "one", 2: "two"}PrintMap(m2) // 输出: 1 one  2 two
}

2.6 泛型实际应用

Go 中可以用于实现许多常见的算法和数据结构,如链表、栈、队列等。

package mainimport "fmt"type Stack[T any] struct {items []T
}func (s *Stack[T]) Push(item T) {s.items = append(s.items, item)
}func (s *Stack[T]) Pop() T {if len(s.items) == 0 {panic("stack is empty")}item := s.items[len(s.items)-1]s.items = s.items[:len(s.items)-1]return item
}func main() {stack := &Stack[int]{}stack.Push(1)stack.Push(2)fmt.Println(stack.Pop()) // 输出: 2fmt.Println(stack.Pop()) // 输出: 1
}

3 workspace

go 1.18 引入了 workspace 功能,旨在简化多个模块(module)的管理和开发。workspace 允许你在一个工作空间中同时管理多个 Go 模块,这对于开发大型项目或依赖多个模块时非常有用。

3.1 概念

工作空间(workspace)是 Go 1.18 引入的一个新概念,它可以包含多个 Go 模块。这样,你可以在同一个目录下处理多个模块(module),而无需通过 $GOPATH 来管理它们。

在 Go 1.18 版本中,你需要通过创建一个名为 go.work 的文件来启用工作空间。这个文件定义了工作空间内的 Go 模块及其路径。

3.2 workspace案例

工作空间文件 go.work 用来指定工作空间中包含的模块。例如,如果你有多个模块在不同的目录中,可以在 go.work 中列出它们的路径。

假设你有两个模块 moduleAmoduleB,它们位于不同的文件夹中,你可以在根目录下创建一个 go.work 文件,将这两个模块包括在内:

go 1.23use (./moduleA./moduleB
)

这将指示 Go 使用 moduleAmoduleB 两个模块进行构建。

一旦设置了 go.work 文件,Go 命令会自动识别工作空间并处理模块之间的依赖关系。例如,你可以使用 go buildgo run 命令时,Go 会自动处理跨模块依赖。

例如,运行 go run . 时,Go 会处理 go.work 文件并且可以跨模块找到所需的依赖,而不需要单独执行每个模块的命令。

假设你有以下文件结构:

/workspacego.work/moduleAgo.modmain.go/moduleBgo.modmain.go

go.work 文件:

go 1.23use (./moduleA./moduleB
)

moduleA/go.mod 文件:

module moduleAgo 1.23

moduleB/go.mod 文件:

module moduleBgo 1.23

moduleB/utilsB 文件:

package moduleBimport "fmt"func HelloB() {fmt.Println("HelloB")
}

moduleA/main 文件:

package mainimport "moduleB"func main() {moduleB.HelloB()
}

在根目录 /workspace 下运行 go run 或其他 Go 命令。

Go 会处理 go.work 中列出的模块路径,并根据需求解析、构建或运行所有模块。

Go 1.18 引入的工作空间功能使得多模块管理变得更为简单,适用于大型项目或需要协调多个模块的开发场景。通过创建 go.work 文件,可以让 Go 项目更好地管理跨模块依赖,同时提高开发效率和可维护性。

4 模糊测试

Go 1.18 引入了 模糊测试(Fuzzing)功能,它是一种自动化的测试技术,用于发现程序中的潜在缺陷和安全漏洞。模糊测试通过自动生成大量的随机输入数据来测试程序的健壮性,帮助开发者发现代码中的异常行为、崩溃、内存泄漏等问题。

在 Go 1.18 中,模糊测试被集成到了标准库中,你可以直接在 Go 中进行模糊测试,而不需要额外的工具或库。

4.1概念

模糊测试是一种通过向程序输入大量随机、无意义的(或者故意设计的异常的)数据来检测程序潜在漏洞的技术。它主要用于:

  • 发现代码中的边界情况、崩溃、未处理的异常等。
  • 测试程序对异常输入的处理能力,增强程序的健壮性。
  • 通过大量随机的输入数据测试算法、输入验证、错误处理等方面。

4.2 如何使用模糊测试

Go 1.18 引入了对模糊测试的内置支持,允许通过 testing 包来编写模糊测试函数。模糊测试的函数以 Fuzz 开头,使用 testing 包中的 Fuzz 类型来定义。

基本步骤:

  1. 创建模糊测试函数:在测试代码中定义一个模糊测试函数,函数的参数是一个类型为 testing.F 的对象,代表模糊测试框架。
  2. 编写测试逻辑:在模糊测试函数内部,编写逻辑来处理模糊输入并验证输出。
  3. 运行测试:使用 go test 命令来运行模糊测试。

示例:

假设我们有一个函数 Add,它简单地将两个整数相加。

package mainimport "fmt"func Add(a, b int) int {return a + b
}

我们可以编写一个模糊测试函数来测试 Add 函数。

定义模糊测试函数:

package mainimport ("testing"
)func FuzzAdd(f *testing.F) {// 预设一些初始的模糊测试用例f.Add(1, 2)f.Add(3, 4)// 模糊测试逻辑f.Fuzz(func(t *testing.T, a, b int) {result := Add(a, b)// 简单验证:返回的结果是否为预期if result != a+b {t.Errorf("Add(%d, %d) = %d; want %d", a, b, result, a+b)}})
}

在这个示例中,我们使用 f.Add 来添加初始的输入值,之后通过 f.Fuzz 来生成随机的输入对,并使用 t.Errorf 来报告结果是否符合预期。

运行模糊测试:

你可以通过 go test 来运行模糊测试。

go test -fuzz=FuzzAdd

此命令会开始执行模糊测试并生成随机的测试输入来执行 Add 函数。Go 会根据生成的输入验证函数行为是否正确。

模糊测试参数

  • f.Add: 用于为模糊测试提供初始输入。这些输入会在测试过程中作为种子,基于这些种子数据,Go 会生成更多的随机数据。
  • f.Fuzz: 用于定义实际的模糊测试逻辑。这里你可以编写逻辑来处理模糊输入并进行断言。

4.3 模糊测试常见用法

模糊测试特别适用于以下几种场景:

  • 函数边界情况测试:例如,测试字符串处理函数是否能正确处理空字符串、特殊字符、非常长的字符串等。
  • 错误处理验证:验证程序在接收到不合法输入时是否会崩溃或产生错误。
  • 性能和压力测试:通过给定极限的输入来检查程序在边界条件下的表现。

4.4 自定义输入生成

Go 的模糊测试功能允许开发者对生成的输入进行更细粒度的控制。例如,你可以为模糊测试提供自定义的输入生成器,来专门生成特定类型的测试数据。

示例:自定义输入生成

func FuzzCustomInput(f *testing.F) {f.Add([]byte("initial input"))f.Fuzz(func(t *testing.T, data []byte) {if len(data) > 100 {t.Errorf("input data too long: %v", data)}})
}

运行模糊测试的其他选项

  • -fuzztime: 设置运行模糊测试的时间限制。默认情况下,模糊测试会一直运行直到手动停止,可以通过 -fuzztime 参数来控制运行时长。

    go test -fuzz=FuzzAdd -fuzztime=30s
    

    这将限制模糊测试的运行时间为 30 秒。

  • -fuzzminimize: 尝试最小化产生错误的测试用例,这样可以帮助开发者快速定位问题。

    go test -fuzz=FuzzAdd -fuzzminimize
    

相关文章:

【Go学习】-01-6-数据库泛型新特性

【Go学习】-01-6-数据库泛型新特性 1 数据库操作1.1 操作mysql1.1.1 Insert1.1.2 Select1.1.3 Update1.1.4 Delete1.1.5 sql事务 1.2 go操作Redis 2 泛型2.1 非泛型函数2.2 泛型函数2.3 泛型类型2.3.1 泛型结构体2.3.2 泛型接口 2.4 泛型约束2.5 泛型切片和映射2.5.1 泛型切片2…...

算法学习(22)—— BFS解决最短路问题

关于最短路问题 最短路问题是“图论”里非常重要的一类问题,涉及的内容非常多,在这个专题里,我们主要讲“边权为1的最短路问题”,因为这个比较基础比较简单而关于啥是“边权为1的最短路问题”,我们通过下面的例子来讲…...

【双层模型】考虑供需双侧的综合能源双层优化模型

目录 主要内容 内容研究 1.模型简介 2 程序释义 部分代码 运行结果 下载链接 主要内容 该程序实现一个综合能源系统的优化调度双层模型,上下层分别采用差分进化算法和规划算法进行求解。模型考虑了多种能源设备,包括燃气轮机、燃气锅炉、风电…...

【读书笔记/源码】How Tomcat Works 笔记- c11~c13

chapter11: standardwrapperchapter12: 无程序 第十章 安全性 servlet容器是通过一个名为验证器的阀来支持安全限制的。当servlet容器启动时,验证器阀会被添加到Context容器的管道中。 验证器阀会调用Context容器的领域对象的authenticate()方法,传入…...

Electron快速入门——跨平台桌面端应用开发框架

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…...

Vision Transformer模型详解(附pytorch实现)

写在前面 最近,我在学习Transformer模型在图像领域的应用。图像处理任务一直以来都是深度学习领域的重要研究方向,而传统的卷积神经网络已在许多任务中取得了显著的成绩。然而,近年来,Transformer模型由于其在自然语言处理中的成…...

中国区域创新创业指数IRIEC数据(省级、地市级)1990-2020年-社科数据

中国区域创新创业指数IRIEC数据(省级、地市级)1990-2020年-社科数据https://download.csdn.net/download/paofuluolijiang/90028728 https://download.csdn.net/download/paofuluolijiang/90028728 中国区域创新创业指数(IRIEC)…...

Elasticsearch:减少 Elastic 容器镜像中的 CVE(常见的漏洞和暴露)

作者:来自 Elastic Maxime Greau 在这篇博文中,我们将讨论如何通过在 Elastic 产品中切换到最小基础镜像并优化可扩展漏洞管理程序的工作流程来显著减少 Elastic 容器镜像中的常见漏洞和暴露 (Common Vulnerabilities and Exposures - CVEs)。 基于 Chai…...

webpack02

webpack中常用loader postcss-loader 在css-loader之前,对css进行一些操作,,,比如统一加前缀,,或者是重置样式,,, 这个postcss-loader会自己去找 postcss工具&#xff0…...

腾讯云更改用户为root

最近买了台99元一年的2核的云服务器,方便学习一些java开发中间件,以及部署一些项目。 1.设置root用户密码 sudo passwd root 2.修改配置文件 ll /etc | grep ssh cd /etc/ssh/ ls vim sshd_config 输入/PasswordAuthentication 寻找 输入:set nu 再按下…...

Excel导入导出-若依版本

最终效果 1、导出 1、在实体类上加注解 Excel(name “客户类型名称”) ToString AllArgsConstructor NoArgsConstructor public class UserType extends BaseEntity2 implements Serializable {Excel(name "客户类型ID", cellType Excel.ColumnType.NUMERIC…...

【Qt】快速添加对应类所需的头文件包含

快速添加对应类所需的头文件包含 一,简介二,操作步骤 一,简介 本文介绍一下,如何快速添加对应类所需要包含的头文件,可以提高开发效率,供参考。 二,操作步骤 以QTime类为例: 选中…...

基于服务器部署的综合视频安防系统的智慧快消开源了。

智慧快消视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。国产化人工智能“…...

浅谈棋牌游戏开发流程七:反外挂与安全体系——守护游戏公平与玩家体验

一、前言:为什么反外挂与安全这么重要? 对于任何一款线上棋牌游戏而言,公平性和玩家安全都是最重要的核心要素之一。如果游戏环境充斥着各式各样的外挂、作弊方式,不仅会毁坏玩家体验,更会导致游戏生态崩塌、口碑下滑…...

Laravel操作ElasticSearch

在Laravel项目中操作ElasticSearch可以通过以下步骤来实现,通常会借助相应的ElasticSearch客户端扩展包。 ### 安装ElasticSearch客户端包 在Laravel项目中,常用的是 elasticsearch/elasticsearch 这个PHP客户端库来与ElasticSearch进行交互&#xff0c…...

缓存-文章目录

关于缓存系列文章: 缓存学习总结1(缓存分类) 缓存学习总结2(服务器本地缓存) 缓存学习总结3(服务器内存缓存)推荐使用 缓存学习总结4(分布式缓存) 关于redis系列文章…...

安装教程:慧集通集成平台(DataLinkX)智能体客户端安装操作(Linux/windows/mac)

1.下载客户端 使用提供的账号登录集成平台后台(https://www.datalinkx.cn/),点击左侧菜单栏【智能体】→【智能体】进入到智能体列表界面,在该界面我们找到功能栏中的下载按钮点击则会弹出下载界面,在该界面我们可以选择不同的系统操作系统来下载对应版…...

解决vmware虚拟机和宿主机之间不能复制粘贴

在虚拟机内执行一下命令 /usr/bin/vmware-user 更多解决方案 https://www.cnblogs.com/wutou/p/17629408.html...

由源程序到运行

由源程序到运行 第一步:编写源程序 assume cs:codesg codesg segmentmov ax,0123Hmov bx,0456Hadd ax,bxadd ax,axmov ax,4c00hint 21h codesg ends end第二步:进行编译 进入到编译目录 编译 .asm文件生成目标文件(.obj) m…...

Java-JDBC的使用

目录 一、JDBC(java数据库连接):java database connector 二、使用JDBC的步骤 三、加条件查询 四、预处理(防止SQL注入) 五、Statement和PreparedStatement的优略 六、将数据中的数据查询出来后需要保存在一个集合中,方便前端…...

如何优化亚马逊广告以提高ROI?

在竞争激烈的亚马逊市场中,优化广告以提高投资回报率(ROI)是卖家的关键任务。以下是一些实用的策略: 一、精准的关键词研究与选择 深入了解产品特性和目标受众 详细分析产品的功能、用途、优势和适用人群。例如,如果你…...

身是菩提树,心如明镜台;时时勤拂拭,莫使惹尘埃。

神秀: 身是菩提树,心如明镜台;时时勤拂拭,莫使惹尘埃。 第一个毛病1: 在神秀看来,修行就是要保持我们本来干净的心, 跟外部世界的灰尘之间的隔绝状态,始终保持这种隔绝, 尘世是什么? 尘就是烦恼,人世间无处不是烦恼&a…...

如何修复富士相机卡错误并恢复卡数据

富士相机以其卓越的图像质量而闻名,但不幸的是,其 SD 卡错误可能会意外发生,导致数据丢失和摄影会话中断。 在本指南中,我们将引导您了解常见的富士相机 SD 卡错误、如何修复这些错误,以及如何有效地从损坏的卡中恢复…...

呼叫中心中间件实现IVR进入排队,判断排队超时播放提示音

文章目录 [TOC](文章目录) 前言需求排队结束原因 联系我们实现步骤1. 调用http接口返回动作2. 启用拨号方案 前言 需求 呼叫中心需要实现调用IVR接口进入排队,如果是因为等待超时导致退出排队的,那就播放一段提示音再挂断通话;其他的情况就…...

数据分析思维(八):分析方法——RFM分析方法

数据分析并非只是简单的数据分析工具三板斧——Excel、SQL、Python,更重要的是数据分析思维。没有数据分析思维和业务知识,就算拿到一堆数据,也不知道如何下手。 推荐书本《数据分析思维——分析方法和业务知识》,本文内容就是提取…...

SpringBoot3动态切换数据源

背景 随着公司业务战略的发展,相关的软件服务也逐步的向多元化转变,之前是单纯的拿项目,赚人工钱,现在开始向产品化\服务化转变。最近雷袭又接到一项新的挑战:了解SAAS模型,考虑怎么将公司的产品转换成多租…...

Java虚拟机面试题:内存管理(上)

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...

WPF通过反射机制动态加载控件

Activator.CreateInstance 是 .NET 提供的一个静态方法&#xff0c;它属于 System 命名空间。此方法通过反射机制根据提供的类型信息。 写一个小demo演示一下 要求&#xff1a;在用户反馈界面点击建议或者评分按钮 弹出相应界面 编写MainWindow.xmal 主窗体 <Window x:C…...

前端学习-操作元素属性(二十三)

前言 假期快乐&#xff0c;大家加油 操作元素属性 操作元素常用属性 还可以通过 JS 设置/修改标签元素属性&#xff0c;比如通过 src更换 图片最常见的属性 比如:href、title、src等语法:对象.属性 值 const pic document.querySelector(img);pic.src ./images/b0.jpgp…...

Javascript 编写的一个红、黄、绿灯交替变亮

为了创建一个简单但功能完整的交通灯程序&#xff0c;我们将使用 HTML、CSS 和 JavaScript 来实现红、黄、绿三种颜色按照规定的顺序循环显示。这个例子将确保灯光按照红 -> 绿 -> 黄的顺序循环&#xff0c;并且可以调整每个灯光的持续时间以模拟真实的交通灯行为。 效果…...

基于64QAM的载波同步和定时同步性能仿真,包括Costas环和gardner环

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论知识概要 载波同步是…...

小于n的最大数 - 贪心算法 - C++

字节经典面试题 给定一个整数n&#xff0c;并从1~9中给定若干个可以使用的数字&#xff0c;根据上述两个条件&#xff0c;得到每一位都为给定可使用数字的、最大的小于整数n的数&#xff0c;例如&#xff0c;给定可以使用的数字为 {2,3,8} 三个数&#xff1a;给定 n3589&#x…...

leetcode(hot100)4

解题思路&#xff1a;双指针思想 利用两个for循环&#xff0c;第一个for循环把所有非0的全部移到前面&#xff0c;第二个for循环将指针放在非0的末尾全部加上0。 还有一种解法就是利用while循环双指针条件&#xff0c;当不为0就两个指针一起移动 &#xff0c;为0就只移动右指针…...

【Pandas】pandas Series xs

Pandas2.2 Series Indexing, iteration 方法描述Series.get()用于根据键&#xff08;索引标签&#xff09;从 Series 中获取值Series.at用于快速访问标量值&#xff08;单个元素&#xff09;的访问器Series.iat用于快速访问标量值&#xff08;单个元素&#xff09;的访问器Se…...

【linux内核分析-存储】EXT4源码分析之“文件删除”原理【七万字超长合并版】(源码+关键细节分析)

EXT4源码分析之“文件删除”原理【七万字超长合并版】&#xff08;源码关键细节分析&#xff09;&#xff0c;详细的跟踪了ext4文件删除的核心调用链&#xff0c;分析关键函数的细节&#xff0c;解答了开篇中提出的三个核心疑问。 文章目录 提示前言全文重点索引1.源码解析1.1 …...

一个在ios当中采用ObjectC和opencv来显示图片的实例

前言 在ios中采用ObjectC编程利用opencv来显示一张图片&#xff0c;并简单绘图。听上去似乎不难&#xff0c;但是实际操作下来&#xff0c;却不是非常的容易的。本文较为详细的描述了这个过程&#xff0c;供后续参考。 一、创建ios工程 1.1、选择ios工程类型 1.2、选择接口模…...

使用Python实现基于强化学习的游戏AI:打造智能化游戏体验

友友们好! 我的新专栏《Python进阶》正式启动啦!这是一个专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会找到: ● 深入解析:每一篇文章都将…...

STM32G0B1 can Error_Handler 解决方法

问题现象 MCU上电&#xff0c;发送0x13帧数据固定进入 Error_Handler 硬件介绍 MCU :STM32G0B1 can:NSI1042 tx 接TX RX 接RX 折腾了一下午&#xff0c;无解&#xff0c;问题依旧&#xff1b; 对比测试 STM32G431 手头有块G431 官方评估版CAN 模块&#xff1b; 同样的…...

洛谷 P2511 [HAOI2008] 木棍分割

第一问很简单&#xff0c;第二问 d p dp dp。 &#xff08;真是哪都能混个 d p dp dp&#xff09; 参考题解 #include <bits/stdc.h>using namespace std;int read() {int x 0, f 1; char c getchar();while (c < 0 || c > 9) {if (c -) f -1; c getcha…...

二极管钳位电路分享

二极管钳位&#xff08;I/O的过压/浪涌保护等&#xff09; 如果我们的电路环境接收外部输入信号容易受到噪声影响&#xff0c;那我们必须采取过压和浪涌保护措施&#xff0c;其中一个方式就是二极管钳位保护。 像上图&#xff0c;从INPUT输入的电压被钳位在-Vf与VCCVf之间&…...

guestfish/libguestfs镜像管理工具简介

文章目录 简介guestfishlibguestfs项目 例子原理代码libguestfs架构参考 简介 guestfish Guestfish 是libguestfs项目中的一个工具软件&#xff0c;提供修改虚机镜像内部配置的功能。它不需要把虚机镜像挂接到本地&#xff0c;而是为你提供一个shell接口&#xff0c;你可以查…...

AutoSar架构学习笔记

1.AUTOSAR&#xff08;Automotive Open System Architecture&#xff0c;汽车开放系统架构&#xff09;是一个针对汽车行业的软件架构标准&#xff0c;旨在提升汽车电子系统的模块化、可扩展性、可重用性和互操作性。AUTOSAR的目标是为汽车电子控制单元&#xff08;ECU&#xf…...

Scade pragma: separate_io

概述 在 Scade 语言中&#xff0c;支持对用户自定义算子使用 separate_io pragma 进行修饰。其形式如&#xff1a; function #pragma kcg separate_io #end N(x: int8) returns (y,z: int8) let y x;z x; tel在上例中&#xff0c;算子N 就被 pragma #pragma kcg separate_i…...

三天速成微服务

微服务技术栈 总结 微服务技术对比 技术栈 SpringCloud SpringCloud是目前国内使用最广泛的微服务框架。官网地址:https://spring.io/projects/spring-cloud Springboot和SpringCould兼容性 代码目录结构如下 用于远程调用Bean 代码 package cn.itcast.order.config;//import …...

【MySQL】九、表的内外连接

文章目录 前言Ⅰ. 内连接案例&#xff1a;显示SMITH的名字和部门名称 Ⅱ. 外连接1、左外连接案例&#xff1a;查询所有学生的成绩&#xff0c;如果这个学生没有成绩&#xff0c;也要将学生的个人信息显示出来 2、右外连接案例&#xff1a;对stu表和exam表联合查询&#xff0c;把…...

GitLab 创建项目、删除项目

1、创建项目 点击左上角图标&#xff0c;回到首页 点击 Create a project 点击 Create blank project 输入项目名称&#xff0c;点击Create Project 创建成功 2、删除项目 进入项目列表 点击对应项目&#xff0c;进入项目 进入Settings页面 拖到页面底部&#xff0c;展开Adva…...

python学opencv|读取图像(二十六)使用cv2.putText()绘制文字进阶-在图像上写文字

【1】引言 前序已经学会了在画布上绘制文字的大部分技巧&#xff0c;相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;二十三&#xff09;使用cv2.putText()绘制文字-CSDN博客 python学opencv|读取图像&#xff08;二十四&#xff09;使用cv2.putText()绘制…...

Apache HTTPD 多后缀解析漏洞

目录 漏洞简介 漏洞环境 漏洞复现 漏洞防御 漏洞简介 Apache HTTPD 支持一个文件拥有多个后缀&#xff0c;并为不同后缀执行不同的指令。比如&#xff0c;如下配置文件&#xff1a; AddType text/html .html AddLanguage zh-CN .cn 以上就是Apache多后缀的特性。如果运维…...

(二)当人工智能是一个函数,函数形式怎么选择?ChatGPT的函数又是什么?

在上一篇文章中&#xff0c;我们通过二次函数的例子&#xff0c;讲解了如何训练人工智能。今天&#xff0c;让我们进一步探讨&#xff1a;面对不同的实际问题&#xff0c;应该如何选择合适的函数形式&#xff1f; 一、广告推荐系统中的函数选择 1. 业务目标 想象一下&#x…...

JavaScript学习-入门篇

​ JavaScript的运行环境 开发环境就是开发JavaScript代码所需的环境&#xff0c;一般建议新手刚刚开始使用一些记事本工具&#xff08;如sublime、editPlus、VScode&#xff09;&#xff0c;锻炼代码的手感。等学习到一定阶段&#xff0c;就可以使用集成开发工具IDE&#xff0…...