Go语言->练习6例

1.go语言的接口实现

接口(interface)是一种类型,它定义了一组方法的集合。任何类型只要实现了接口中定义的所有方法,就被认为实现了该接口。

在Go语言中,使用接口的最佳实践可以提高代码的可读性、可维护性和灵活性。

  • 小接口与大接口: 尽量设计小接口,一个接口应该只包含少量的方法,而不是设计一个大而全的接口。这样可以避免实现接口时不必要的负担,并使接口更具通用性。
  • 基于使用场景设计接口: 设计接口时应该考虑使用场景,而不是从具体的实现出发。思考在你的应用程序中如何使用接口,以及接口应该提供哪些方法来满足这些使用场景。
  • 使用合适的命名: 为接口和方法使用清晰的命名,使其能够表达出其用途和功能。命名应该具有可读性和表达性,让其他开发者能够轻松理解接口的用途。
  • 避免不必要的接口: 不要为每个类型都创建一个接口,只有在多个类型之间确实存在共享的行为和功能时才使用接口。不要过度使用接口,以免导致不必要的复杂性。
  • 使用接口作为函数参数和返回值: 使用接口作为函数参数和返回值,可以使函数更加通用,允许传入不同类型的参数,并返回不同类型的结果。这可以提高代码的复用性和扩展性。
  • 注释和文档: 为接口提供清晰的文档和注释,说明接口的用途、方法的功能和预期行为。这可以帮助其他开发者更好地理解接口的使用方式。
  • 用例驱动设计: 在设计接口时,可以从使用的角度出发,先考虑接口在实际场景中如何被调用,然后再设计接口的方法和签名。
  • 将接口的实现与定义分离: 将接口的实现与接口的定义分开,这样可以使实现更灵活,可以在不修改接口定义的情况下实现新的类型。
  • 默认实现: 在接口定义中,可以为某些方法提供默认实现,从而减少实现接口时的工作量。这对于可选方法或者某些方法的默认行为很有用。
  • 使用空接口谨慎: 使用空接口(interface{})应谨慎,因为它会降低类型安全性。只有在确实需要处理不同类型的值时才使用空接口,同时要注意类型断言和错误处理。

设计和使用接口时要根据实际需求和项目的特点来选择合适的方案。

package mainimport "fmt"type Shape interface {Area() float64Perimeter() float64
}type Rectangle struct {Width  float64Height float64
}func (r Rectangle) Area() float64 {return r.Width * r.Height
}func (r Rectangle) Perimeter() float64 {return 2 * (r.Height + r.Width)
}func main() {var s Shaperect := Rectangle{Height: 3, Width: 4}s = rectfmt.Println("面积:", s.Area())fmt.Println("周长:", s.Perimeter())
}// 理解与记忆方法
// 1接口是方法的集合:接口定义了一组方法,任何类型实现了这些方法就实现了接口。
// 2隐式实现:Go 不需要显式声明实现某个接口,只要类型的方法集包含接口的所有方法即可。
// 3空接口:interface{} 是最通用的接口,可存储任何类型值,用于灵活性需求。
// 4接口值的内部结构:接口值包含动态类型信息和实际数据值,支持类型断言和类型切换。
// 5鸭子类型:如果一个东西走起来像鸭子,叫起来也像鸭子,那么它就是鸭子。即,只要类型实现了接口的方法,就被认为实现了接口。

输出结果:

Running] go run "d:\Microsoft VS Code\GOproject\src\go_code\chapter\interface\testshape\shape.go"
面积: 12
周长: 14[Done] exited with code=0 in 0.911 seconds

2.go语言中如何访问私有成员

导出公有方法(get和set)

package mainimport "fmt"//定义一个结构体
type Person struct {name stringage  int
}//导出Get方法,获取Name
func (p *Person) GetName() string {return p.name
}//导出Set方法,设置Name
func (p *Person) SetName(newName string) {p.name = newName
}//导出Get方法,获取Age
func (p *Person) GetAge() int {return p.age
}//导出Set方法,设置Age
func (p *Person) SetAge(newAge int) {if newage > 0 {p.Age = newage} else {fmt.Println("年龄不能为负")}
}func main() {//创建zhangsan实例person := Person{name: "zhangsan",age:  18,}//调用Get方法fmt.Println("姓名:", person.GetName())fmt.Println("年龄:", person.GetAge())//输出结果:// 姓名: zhangsan// 年龄: 18//调用Set方法person.SetName("Lis")person.SetAge(20)fmt.Println("新名字:", person.GetName())fmt.Println("新年龄:", person.GetAge())//测试非法参数person.SetAge(-18)
}

输出结果:

[Running] go run "d:\Microsoft VS Code\GOproject\src\go_code\chapter4\main.go"
姓名: zhangsan
年龄: 18
新名字: Lis
新年龄: 20
年龄不能为负[Done] exited with code=0 in 1.271 seconds

3.《剪刀石头布》游戏;

设计思路:石头剪刀布分别用0、1、2,来表示

系统随机输出一个数字,用户通过命令行输入数字,进行对比,决定出是用户获胜还是系统获胜(采用数学思想),设计避免用户输入其他数字,输入其他数字输出“请输入正确的数字”,然后重新让用户输入。

package mainimport ("bufio"  // 用于读取用户输入"fmt""math/rand""os""strconv""strings""time"
)func main() {// 初始化随机数种子localRand := rand.New(rand.NewSource(time.Now().UnixNano()))// 初始化随机数种子computer := localRand.Intn(3)// 获取用户的有效输入user := getUserInput()// 显示双方选择names := []string{"石头", "剪刀", "布"}// 显示对战结果fmt.Printf("\n你出了%s,系统出了%s。\n", names[user], names[computer])//判断并显示结果switch determineWinner(user, computer) {case 0:fmt.Println("平局")case 1:fmt.Println("你赢了!好腻害呀!")case -1:fmt.Println("系统赢了!")}
}// 判断胜负函数
func determineWinner(user, computer int) int {//使用数学公式判断胜负关系switch (user - computer + 3) % 3 {case 0:return 0 //平局case 1:return -1 //系统赢default:return 1 //用户赢}
}func getUserInput() int {reader := bufio.NewReader(os.Stdin)// 使用无限循环直到获得有效输入for {fmt.Print("请出拳(0: 石头,1: 剪刀,2: 布):")// 读取输入直到遇到换行符(Windows系统注意换行符是\r\n)input, _ := reader.ReadString('\n')// 去除首尾空白字符(包括可能的空格和换行符)input = strings.TrimSpace(input)// 将字符串转换为整数num, err := strconv.Atoi(input)if err != nil {fmt.Println("请输入整数") // 处理非数字输入continue}// 验证输入范围(建议先显示错误再判断范围)if num < 0 || num > 2 {fmt.Println("请输入0-2之间的数字!")continue}return num}
}

测试:

PS D:\Microsoft VS Code\GOproject\src\go_code\project1> go run .\3-1.go
请出拳(0: 石头,1: 剪刀,2:):1你出来剪刀,系统出了剪刀。
平局
PS D:\Microsoft VS Code\GOproject\src\go_code\project1> go run .\3-1.go
请出拳(0: 石头,1: 剪刀,2:):3
请输入0-2之间的数字!
请出拳(0: 石头,1: 剪刀,2:):4
请输入0-2之间的数字!
请出拳(0: 石头,1: 剪刀,2:):2你出来布,系统出了布。
平局
PS D:\Microsoft VS Code\GOproject\src\go_code\project1> go run .\3-1.go
请出拳(0: 石头,1: 剪刀,2:):1你出来剪刀,系统出了布。
你赢了!好腻害呀!
PS D:\Microsoft VS Code\GOproject\src\go_code\project1> go run .\3-1.go
请出拳(0: 石头,1: 剪刀,2:):0你出了石头,系统出了剪刀。
你赢了!好腻害呀!
PS D:\Microsoft VS Code\GOproject\src\go_code\project1> 

4. 猜数字游戏

一个小游戏:在0-999之间随机生成一个数,用户在终端进行猜测,假设说生成的数字是100,用户第一次猜200,那么就提示用户“答案在在0-200区间”,以此类推,直到用户答出争取的数字,并输出”您成功答出正确答案:答案;共猜了n次“

package mainimport ("bufio" // 用于读取用户输入"fmt""math/rand""os""strconv""strings"
)func main() {// 初始化随机数种子target := rand.Intn(1000)low, high := 0, 999attempts := 0reader := bufio.NewReader(os.Stdin)fmt.Println("数字猜谜游戏开始!请输入0-999的随机整数:")for {fmt.Printf("(%d尝试,当前范围[%d-%d])", attempts, low, high)input, _ := reader.ReadString('\n')input = strings.TrimSpace(input)reader.Reset(os.Stdin)guess, err := strconv.Atoi(input)if err != nil || guess < low || guess > high {fmt.Printf("请输入%d-%d范围内的有效整数\n", low, high)continue}attempts++if guess == target {fmt.Printf("您成功答出正确答案:%d(共尝试%d次)\n", target, attempts)break} else if guess > target {high = guess - 1fmt.Printf("答案在更小的范围内\n")} else {low = guess + 1fmt.Printf("答案在更大的范围内\n")}}
}

输出测试:

PS D:\Microsoft VS Code\GOproject\src\go_code\project2> go run .\1.go
数字猜谜游戏开始!请输入0-999的随机整数:
(0尝试,当前范围[0-999])500
答案在更小的范围内
(1尝试,当前范围[0-499])300
答案在更大的范围内
(2尝试,当前范围[301-499])400
答案在更小的范围内
(3尝试,当前范围[301-399])150
请输入301-399范围内的有效整数
(3尝试,当前范围[301-399])350
答案在更大的范围内
(4尝试,当前范围[351-399])375
答案在更大的范围内
(5尝试,当前范围[376-399])190
请输入376-399范围内的有效整数
(5尝试,当前范围[376-399])390
答案在更小的范围内
(6尝试,当前范围[376-389])380
答案在更大的范围内
(7尝试,当前范围[381-389])385
答案在更大的范围内
(8尝试,当前范围[386-389])388
答案在更大的范围内
(9尝试,当前范围[389-389])389
您成功答出正确答案:389(共尝试10次)
PS D:\Microsoft VS Code\GOproject\src\go_code\project2> 

简易学生查询系统

使用Go语言写一个教学管理系统,存储学生名字、学生年龄、学生班级、学习成绩(ABCDE由高到低),然后给用户一个终端输入的模块,输入1查询学生的基本信息(名字、班级年龄),输入2查询学生成绩,输入3添加学生信息,输入4删除学生信息,输入5查询所有学生信息,输入6退出系统;要注意其中输入非指定信息出现的问题如何解决,开始吧。

代码实现:

package main// 导入需要的包
import ("bufio"   // 用于读取输入"fmt"     // 用于输入输出格式化"os"      // 用于操作系统交互"strconv" // 用于字符串和数字转换"strings" // 用于字符串处理
)// 定义学生结构体,用于存储单个学生的完整信息
type Student struct {Name  string // 学生姓名Age   int    // 学生年龄Class string // 学生所在班级Grade string // 学生成绩等级(A-E)
}// 全局变量:使用切片存储所有学生信息(切片是动态数组,可以自动扩展)
var students []Student// 查询学生基本信息函数
func queryStudentInfo(scanner *bufio.Scanner) {fmt.Print("请输入要查询的学生姓名:")scanner.Scan()                            // 读取用户输入name := strings.TrimSpace(scanner.Text()) // 去除前后空格found := false // 标记是否找到学生// 遍历所有学生for _, s := range students {// 使用不区分大小写的比较(比如输入"zhangsan"可以匹配"ZhangSan")if strings.EqualFold(s.Name, name) {// 使用格式化输出显示学生信息fmt.Printf("\n学生信息:\n姓名:%s\n年龄:%d\n班级:%s\n",s.Name, s.Age, s.Class)found = true}}if !found {fmt.Println("未找到该学生信息")}
}// 查询学生成绩函数
func queryStudentGrade(scanner *bufio.Scanner) {fmt.Print("请输入要查询成绩的学生姓名:")scanner.Scan()name := strings.TrimSpace(scanner.Text())found := false// 遍历学生切片查找匹配项for _, s := range students {if strings.EqualFold(s.Name, name) {fmt.Printf("\n学生成绩:\n姓名:%s\n成绩:%s\n",s.Name, s.Grade)found = true}}if !found {fmt.Println("未找到该学生信息")}
}// 添加学生信息函数
func addStudent(scanner *bufio.Scanner) {var student Student // 创建新的学生对象// 收集学生信息并进行验证fmt.Print("请输入学生姓名:")scanner.Scan()student.Name = strings.TrimSpace(scanner.Text())fmt.Print("请输入学生年龄:")scanner.Scan()// 将字符串转换为整数,并进行有效性检查age, err := strconv.Atoi(strings.TrimSpace(scanner.Text()))if err != nil || age < 0 { // 检查是否为合法年龄fmt.Println("无效的年龄输入")return // 直接返回,不继续执行}student.Age = agefmt.Print("请输入学生班级:")scanner.Scan()student.Class = strings.TrimSpace(scanner.Text())fmt.Print("请输入学生成绩(ABCDE):")scanner.Scan()// 处理成绩输入:转换为大写并去除空格grade := strings.ToUpper(strings.TrimSpace(scanner.Text()))if !isValidGrade(grade) { // 检查成绩是否合法fmt.Println("无效的成绩输入")return}student.Grade = grade// 将新学生添加到全局切片中students = append(students, student)fmt.Println("学生信息添加成功!")
}// 删除学生信息函数
func deleteStudent(scanner *bufio.Scanner) {fmt.Print("请输入要删除的学生姓名:")scanner.Scan()name := strings.TrimSpace(scanner.Text())// 创建新切片保存保留的学生newStudents := make([]Student, 0)found := false// 遍历所有学生,过滤掉要删除的for _, s := range students {if strings.EqualFold(s.Name, name) {found = true // 标记找到要删除的学生} else {// 将不需要删除的学生加入新切片newStudents = append(newStudents, s)}}if found {students = newStudents // 用新切片替换原切片fmt.Println("学生信息删除成功!")} else {fmt.Println("未找到该学生信息")}
}// 显示所有学生信息函数
func displayAllStudent() {// 处理空数据情况if len(students) == 0 {fmt.Println("当前没有学生信息")return}// 使用表格形式展示数据fmt.Println("\n所有学生信息:")fmt.Println("========================================")// 遍历切片,i是索引(从0开始),s是学生对象for i, s := range students {// 格式化输出:%-8s表示左对齐,占8个字符宽度fmt.Printf("%d. 姓名:%-8s 年龄:%-3d 班级:%-6s 成绩:%s\n",i+1, s.Name, s.Age, s.Class, s.Grade)}fmt.Println("========================================")fmt.Printf("共 %d 条学生记录\n", len(students))
}// 验证成绩是否合法的函数
func isValidGrade(grade string) bool {// 使用map实现快速查找,合法成绩字典validGrades := map[string]bool{"A": true,"B": true,"C": true,"D": true,"E": true,}return validGrades[grade] // 返回查找结果
}// 主函数:程序入口
func main() {// 创建输入扫描器,用于读取标准输入(键盘输入)scanner := bufio.NewScanner(os.Stdin)// 无限循环显示菜单,直到用户选择退出for {// 打印菜单选项fmt.Println("\n教学管理系统")fmt.Println("1. 查询学生基本信息")fmt.Println("2. 查询学生成绩")fmt.Println("3. 添加学生信息")fmt.Println("4. 删除学生信息")fmt.Println("5. 显示所有学生信息")fmt.Println("6. 退出系统")fmt.Print("请选择操作编号:")scanner.Scan()                             // 等待用户输入input := strings.TrimSpace(scanner.Text()) // 处理输入// 使用switch-case处理用户选择switch input {case "1":queryStudentInfo(scanner)case "2":queryStudentGrade(scanner)case "3":addStudent(scanner)case "4":deleteStudent(scanner)case "5":displayAllStudent()case "6":fmt.Println("感谢使用,再见!")return // 结束程序default:fmt.Println("无效的输入,请重新输入")}}
}

进行测试:

PS D:\Microsoft VS Code\GOproject\src\go_code\student> .\studentmain.exe教学管理系统
1. 查询学生基本信息
2. 查询学生成绩
3. 添加学生信息
4. 删除学生信息
5. 显示所有学生信息
6. 退出系统
请选择操作编号:1
请输入要查询的学生姓名:hzy
未找到该学生信息教学管理系统
1. 查询学生基本信息
2. 查询学生成绩
3. 添加学生信息
4. 删除学生信息
5. 显示所有学生信息
6. 退出系统
请选择操作编号:3
请输入学生姓名:hzy
请输入学生年龄:19   
请输入学生班级:Cloud1
请输入学生成绩(ABCDE):A
学生信息添加成功!教学管理系统
1. 查询学生基本信息
2. 查询学生成绩
3. 添加学生信息
4. 删除学生信息
5. 显示所有学生信息
6. 退出系统
请选择操作编号:
无效的输入,请重新输入教学管理系统
1. 查询学生基本信息
2. 查询学生成绩
3. 添加学生信息
4. 删除学生信息
5. 显示所有学生信息
6. 退出系统
请选择操作编号:1
请输入要查询的学生姓名:hzy 学生信息:
姓名:hzy
年龄:19
班级:Cloud1教学管理系统
1. 查询学生基本信息
2. 查询学生成绩
3. 添加学生信息
4. 删除学生信息
5. 显示所有学生信息
6. 退出系统
请选择操作编号:2
请输入要查询成绩的学生姓名:hzy学生成绩:
姓名:hzy
成绩:A教学管理系统
1. 查询学生基本信息
2. 查询学生成绩
3. 添加学生信息
4. 删除学生信息
5. 显示所有学生信息
6. 退出系统
请选择操作编号:5所有学生信息:
========================================
1. 姓名:hzy      年龄:19  班级:Cloud1 成绩:A
========================================1 条学生记录教学管理系统
1. 查询学生基本信息
2. 查询学生成绩
3. 添加学生信息
4. 删除学生信息
5. 显示所有学生信息
6. 退出系统
请选择操作编号:4
请输入要删除的学生姓名:hzy
学生信息删除成功!教学管理系统
1. 查询学生基本信息
2. 查询学生成绩
3. 添加学生信息
4. 删除学生信息
5. 显示所有学生信息
6. 退出系统
请选择操作编号:5
当前没有学生信息教学管理系统
1. 查询学生基本信息
2. 查询学生成绩
3. 添加学生信息
4. 删除学生信息
5. 显示所有学生信息
6. 退出系统
请选择操作编号:6
感谢使用,再见!
PS D:\Microsoft VS Code\GOproject\src\go_code\student> 

文件查找:

使用Go语言做一个简易的文件查询系统,比如在某个文件夹下,存放一些.txt文件,现在使用Go语言去搜索文件名,搜索文件名之后直接查看文件,类似于Linux里面的ls命令找到文件后使用cat命令一个道理。开始吧。

// 文件查询系统 - 支持按名称搜索文本文件并查看内容
package main// 导入所需的标准库包
import ("bufio"         // 带缓冲的输入输出处理"fmt"           // 格式化输入输出"os"            // 操作系统功能(文件、目录操作)"path/filepath" // 跨平台文件路径处理"strconv"       // 字符串与数值类型转换"strings"       // 字符串处理工具
)// 配置常量(建议根据实际情况修改路径)
const (searchDir = "D:/Microsoft VS Code/GOproject/src/go_code/txtlist" // 要搜索的根目录fileExt   = ".txt"                                               // 要搜索的文件扩展名
)// searchFile 文件搜索主功能
// scanner: 从标准输入读取数据的扫描器
func searchFile(scanner *bufio.Scanner) {// 获取用户搜索关键词fmt.Print("\n请输入关键词:")scanner.Scan()keyword := strings.TrimSpace(scanner.Text()) // 去除前后空格// 执行文件搜索files, err := findFiles(keyword)if err != nil {fmt.Printf("搜索失败: %v\n", err)return}// 处理空结果情况if len(files) == 0 {fmt.Println("没有找到匹配的文件")return}// 显示搜索结果列表fmt.Println("\n找到以下文件:")for i, file := range files {fmt.Printf("%d. %s\n", i+1, file) // 显示带编号的文件路径}// 处理用户选择fmt.Print("\n请输入编号查看文件内容(输入0返回上级):")scanner.Scan()choice := strings.TrimSpace(scanner.Text())// 转换用户输入为数字index, err := strconv.Atoi(choice)// 验证输入有效性(重要!防止无效输入导致程序崩溃)if err != nil || index < 0 || index > len(files) {fmt.Println("无效的选择")return}// 显示选定文件内容if index > 0 {showFileContent(files[index-1]) // 注意索引从1开始显示,实际存储从0开始}
}// showFileContent 显示文件内容
// filePath: 要显示文件的完整路径
func showFileContent(filePath string) {// 读取文件全部内容(适用于小文件)content, err := os.ReadFile(filePath)if err != nil {fmt.Printf("读取文件失败:%v\n", err)return}// 格式化输出文件内容fmt.Printf("\n文件内容 [%s]:\n%s\n",filepath.Base(filePath), // 仅显示文件名(不含路径)string(content))         // 字节切片转字符串// 暂停等待用户确认fmt.Println("------------------------------")fmt.Print("按回车键继续...")bufio.NewReader(os.Stdin).ReadBytes('\n') // 读取直到回车键
}// findFiles 递归查找匹配文件
// keyword: 搜索关键词(不区分大小写)
// 返回值: 匹配文件路径切片,错误信息
func findFiles(keyword string) ([]string, error) {var matches []string // 存储匹配文件路径// 检查目录是否存在(重要错误处理)if _, err := os.Stat(searchDir); os.IsNotExist(err) {return nil, fmt.Errorf("目录不存在: %s", searchDir)}// 递归遍历目录(核心文件搜索逻辑)err := filepath.Walk(searchDir, func(path string, info os.FileInfo, err error) error {// 错误优先处理原则if err != nil {return fmt.Errorf("访问路径失败: %w", err) // 包装错误信息}// 筛选条件(同时满足三个条件):// 1. 是文件(非目录)// 2. 扩展名匹配// 3. 文件名包含关键词(不区分大小写)if !info.IsDir() &&strings.HasSuffix(info.Name(), fileExt) &&strings.Contains(strings.ToLower(info.Name()), strings.ToLower(keyword)) {matches = append(matches, path) // 记录匹配路径}return nil // 必须返回nil表示继续遍历})return matches, err
}// main 程序入口函数
func main() {// 创建标准输入扫描器scanner := bufio.NewScanner(os.Stdin)// 主循环(保持程序持续运行)for {// 显示操作菜单fmt.Print("\n文件查询系统\n")fmt.Println("1. 搜索文件")fmt.Println("2. 退出系统")fmt.Print("请选择操作:")// 获取用户输入scanner.Scan()input := strings.TrimSpace(scanner.Text())// 处理菜单选择switch input {case "1":searchFile(scanner)case "2":fmt.Println("感谢使用,再见!")return // 结束程序default:fmt.Println("无效的输入,请重新选择")}}
}

测试结果:(提前准备一些测试文件)

PS D:\Microsoft VS Code\GOproject\src\go_code\foundtxt> go run .\foundtxt.go文件查询系统
1. 搜索文件
2. 退出系统
请选择操作:1请输入关键词:yum找到以下文件:
1. D:\Microsoft VS Code\GOproject\src\go_code\txtlist\yum.txt请输入编号查看文件内容(输入0返回上级):
无效的选择文件查询系统
1. 搜索文件
2. 退出系统
请选择操作:1  请输入关键词:yum找到以下文件:
1. D:\Microsoft VS Code\GOproject\src\go_code\txtlist\yum.txt请输入编号查看文件内容(输入0返回上级):1文件内容 [yum.txt]:
yum 可以下载文件。
------------------------------
按回车键继续...文件查询系统
1. 搜索文件
2. 退出系统
请选择操作:无效的输入,请重新选择文件查询系统
1. 搜索文件
2. 退出系统
exit status 0xc000013a
PS D:\Microsoft VS Code\GOproject\src\go_code\foundtxt> 

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

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

相关文章

Drivestduio 代码笔记与理解

Rigid Node: 表示 car或者trucks Deformable Node : 表示一些 分布之外的 non-rigid 的运动物体&#xff0c; 比如远处的行人等和Cyclist。 在 load_objects 会读取每一个 dynamic objects 的 bounding box’的信息&#xff0c;具体如下&#xff1a; frame_instances 记录了每…

《算法笔记》10.5小节——图算法专题->最小生成树 问题 E: Jungle Roads

题目描述 The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign aid money was spent on extra roads between villages some years ago. But the jungle overtakes roads relentlessly, so the large road network is too expensive to mai…

【音视频】SDL简介

官网&#xff1a;官网 文档&#xff1a;文档 SDL&#xff08;Simple DirectMedia Layer&#xff09;是一套开放源代码的跨平台多媒体开发库&#xff0c;使用C语言写成。SDL提供数种控制图像、声音、输出入的函数&#xff0c;让开发者只 要用相同或是相似的代码就可以开发出跨多…

SpringBoot + SSE 实时异步流式推送

前言 在当今数字化时代&#xff0c;实时数据处理对于企业的决策和运营至关重要。许多业务场景需要及时响应数据库中的数据变化&#xff0c;例如电商平台实时更新库存、金融系统实时监控交易数据等。 本文将详细介绍如何通过Debezium捕获数据库变更事件&#xff0c;并利用Serv…

ADS1299模拟前端(AFE)代替芯片——LHE7909

在现代医疗科技的飞速发展中&#xff0c;精确的生物电势测量设备变得越来越重要。领慧立芯推出的LHE7909&#xff0c;是一款专为心电图&#xff08;ECG&#xff09;和其他生物电势测量设计的低噪声24位模数转换器&#xff08;ADC&#xff09;&#xff0c;为医疗设备制造商提供了…

如何实现Redis和Mysql中数据双写一致性

一、引言 今天我们来聊聊一个在分布式系统中非常常见但又十分棘手的问题——Redis与MySQL之间的双写一致性。我们在项目中多多少少都遇到过类似的困扰&#xff0c;缓存是用Redis&#xff0c;数据库是用MySQL&#xff0c;但如何确保两者之间的数据一致性呢&#xff1f;接下来我…

面试篇 - Transformer前馈神经网络(FFN)使用什么激活函数?

1. FFN结构分解 原始Transformer的FFN层 FFN(x) max(0, xW₁ b₁)W₂ b₂ # 原始论文公式 输入&#xff1a;自注意力层的输出 x&#xff08;维度 d_model512&#xff09; 扩展层&#xff1a;xW₁ b₁&#xff08;扩展为 d_ff2048&#xff09; 激活函数&#xff1a;Re…

基于Python Flask的深度学习电影评论情感分析可视化系统(2.0升级版,附源码)

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

前端vue2修改echarts字体为思源黑体-避免侵权-可以更换为任意字体统一管理

1.下载字体 npm install fontsource/noto-sans-sc 不知道为什么我从github上面下载的不好使&#xff0c;所以就用了npm的 2.引用字体 import fontsource/noto-sans-sc; 在入口文件-main.js中引用 3.设置echats模板样式 import * as echarts from echarts; // 在import的后…

51c自动驾驶~合集37

我自己的原文哦~ https://blog.51cto.com/whaosoft/13878933 #DETR->DETR3D->Sparse4D 走向长时序稀疏3D目标检测 一、DETR 图1 DETR架构 DETR是第一篇将Transformer应用到目标检测方向的算法。DETR是一个经典的Encoder-Decoder结构的算法&#xff0c;它的骨干网…

【MongoDB篇】MongoDB的集合操作!

目录 引言第一节&#xff1a;集合的“诞生”——自动出现还是手动打造&#xff1f;&#x1f914;第二节&#xff1a;集合的“查阅”——看看这个数据库里有哪些柜子&#xff1f;&#x1f4c2;&#x1f440;第三节&#xff1a;集合的“重命名”——给文件柜换个名字&#xff01;…

Goland终端PowerShell命令失效

Goland终端Terminal的PowerShell不能使用&#xff0c;明明windows上升级了PowerShell 7设置了配置文件&#xff0c;但是只能在windows终端下使用&#xff0c;goland终端下直接失效报错&#xff0c;安装升级PowerShell请看Windows11终端升级PowerShell7 - HashFlag - 博客园 问…

简单分析自动驾驶发展现状与挑战

一、技术进展与市场渗透 技术分级与渗透率 当前量产乘用车的自动驾驶等级以L2为主&#xff08;渗透率约51%&#xff09;&#xff0c;L3级处于初步落地阶段&#xff08;渗透率约20%&#xff09;&#xff0c;而L4级仍处于测试和示范运营阶段&#xff08;渗透率约11%&#xff09;2…

【C++类和数据抽象】消息处理示例(1):从设计模式到实战应用

目录 一、数据抽象概述 二、消息处理的核心概念 2.1 什么是消息处理&#xff1f; 2.2 消息处理的核心目标 三、基于设计模式的消息处理实现 3.1 观察者模式&#xff08;Observer Pattern&#xff09; 3.2 命令模式&#xff08;Command Pattern&#xff09; 四、实战场景…

【统计方法】交叉验证:Resampling, nested 交叉验证等策略 【含R语言】

Resampling (重采样方法) 重采样方法是从训练数据中反复抽取样本&#xff0c;并在每个&#xff08;重新&#xff09;样本上重新调整模型&#xff0c;以获得关于拟合模型的附加信息的技术。 两种主要的重采样方法 Cross-Validation (CV) 交叉验证 &#xff1a; 用于估计测试误…

常见的 CSS 知识点整理

1. 盒模型&#xff08;Box Model&#xff09;是什么&#xff1f;标准盒模型和 IE 盒模型的区别&#xff1f; 答案&#xff1a; CSS 盒模型将元素视为一个盒子&#xff0c;由内容&#xff08;content&#xff09;、内边距&#xff08;padding&#xff09;、边框&#xff08;bor…

Educational Codeforces Round 178 div2(题解ABCDE)

A. Three Decks #1.由于最后三个数会相等&#xff0c;提前算出来和&#xff0c;%3判断&#xff0c;再判前两个数是否大于 #include<iostream> #include<vector> #include<stdio.h> #include<map> #include<string> #include<algorithm> #…

如何创建一个导入模板?全流程图文解析

先去找到系统内可以上传东西的按钮 把你的模板上传上去,找到对应的fileName 图里的文字写错了,是复制粘贴"filePath"到URL才能下载

通信原理第七版与第六版区别附pdf

介绍 我用夸克网盘分享了「通信原理 第7版》樊昌信」&#xff0c;链接&#xff1a;https://pan.quark.cn/s/be7c5af4cdce 《通信原理&#xff08;第7版&#xff09;》是在第6版的基础上&#xff0c;为了适应当前通信技术发展和教学需求&#xff0c;并吸取了数十所院校教师的反…

Mysql唯一性约束

唯一性约束&#xff08;Unique Constraint&#xff09;是数据库设计中用于保证表中某一列或多列组合的值具有唯一性的一种规则。它可以防止在指定列中插入重复的数据&#xff0c;有助于维护数据的完整性和准确性。下面从几个方面为你详细解释 作用 确保数据准确性&#xff1a…