Golang 基于 archive/zip 包实现文件

这里写自定义目录标题

    • 摘要
    • 引言
    • Go语言简介
    • archive/zip 包概述:
    • 环境准备
    • 基础概念:
      • 压缩的基本概念:
      • 解压缩的基本概念:
      • ZIP格式的特点:
      • ZIP文件的组成:
      • 使用ZIP的优点:
    • 使用 archive/zip 包进行文件压缩
      • 步骤 1: 引入必要的包
      • 步骤 2: 创建ZIP归档
      • 步骤3:设置压缩级别
      • 步骤 4: 添加文件到ZIP归档
      • 步骤 5: 检查错误并关闭zip.Writer
      • 完整示例代码
    • 使用 archive/zip 包进行文件解压缩
      • 步骤 1: 引入必要的包
      • 步骤 2: 打开ZIP归档文件
      • 步骤 3: 遍历ZIP归档中的所有文件
      • 步骤 4: 检查错误
      • 完整示例代码
    • 总结
      • 关键点总结
    • 参考资料
    • 呼吁行动

摘要

本文介绍了使用Go语言archive/zip包实现文件压缩与解压缩的方法。

  • 通过详细步骤和代码示例,展示了如何高效地压缩数据,节省存储空间,并提高传输效率。
  • 同时,探讨了性能优化和错误处理,为Go开发者提供了实用的压缩解决方案。

引言

在信息爆炸的今天,我们每天都在生成和处理大量的数据和文件。无论是企业内部的文档管理,还是个人的日常资料整理,一个高效、可靠的文件管理工具都是提高生产力的关键。文件批量下载功能,作为文件管理工具中的一个核心组件,能够让用户在有限的时间内快速获取所需文件,从而节省时间,提高工作效率。

然而,开发一个功能全面、用户友好的文件批量下载功能并非易事。它需要考虑到文件的组织结构、下载速度、错误处理以及用户界面的直观性等多种因素。本文将深入探讨如何在Go语言环境下,利用其强大的标准库和第三方库,开发出一个高效、稳定且易于使用的文件批量下载功能。

Go语言简介

Go语言,又称为Golang,是由谷歌开发的一种静态类型、编译型编程语言。以下是Go语言的一些主要特点和优势:

  1. 简洁性:Go语言的设计哲学是简单易学,语法简洁,使得代码易于编写和维护。
  2. 高性能:Go是编译型语言,编译后的程序运行速度快,接近C语言的性能。
  3. 并发支持:Go内置了对并发的支持,使用goroutine和channel可以轻松实现并发编程,而无需复杂的线程管理。
  4. 内存管理:Go拥有自动垃圾回收机制,简化了内存管理,减少了内存泄漏的风险。
  5. 跨平台编译:Go支持跨平台编译,可以在多种操作系统上编译和运行,包括Windows、Linux、macOS等。
  6. 标准库丰富:Go拥有一个功能强大的标准库,涵盖了网络编程、数据处理、加密算法等多个方面。
  7. 工具链完善:Go提供了一套完善的工具链,包括格式化工具gofmt、文档生成工具godoc、测试工具等。
  8. 社区活跃:Go语言由谷歌支持,拥有一个活跃的开发者社区,不断有新的库和框架被开发出来。
  9. 部署简单:Go编译后的程序是一个独立的可执行文件,不需要额外的运行时环境,简化了部署过程。
  10. 安全性:Go语言的设计注重安全性,例如通过内置的race detector工具来检测数据竞争问题。
  11. 兼容性:Go语言支持接口和类型系统,使得编写可扩展和可维护的代码变得更加容易。
  12. 错误处理:Go语言的错误处理机制鼓励显式处理错误,提高了程序的健壮性。

这些特点和优势使得Go语言在云计算、微服务架构、网络编程和系统编程等领域非常受欢迎。

archive/zip 包概述:

archive/zip 是 Go 语言标准库中的一个包,它提供了用于创建和读取 ZIP 归档文件的功能。ZIP 归档是一种广泛使用的压缩文件格式,它允许将多个文件和目录组合成一个单一的文件,并通常用于数据压缩和传输。

以下是 archive/zip 包的作用和它在 Go 语言中的位置的简要解释:

  1. 作用

    • 创建 ZIP 文件:可以将多个文件写入到一个新的 ZIP 归档中。
    • 读取 ZIP 文件:可以打开一个 ZIP 归档并读取其中的文件。
    • 文件压缩:在将文件添加到 ZIP 归档时,可以选择压缩它们以减少文件大小。
    • 文件解压缩:可以从 ZIP 归档中提取文件,并恢复它们的原始状态。
  2. 位置

    • archive/zip 包位于 Go 语言的标准库中,这意味着它随 Go 语言的安装而自动提供,无需额外安装或下载。
  3. 使用场景

    • 文件备份:将多个文件打包成 ZIP 格式,便于存储和传输。
    • 数据分发:将应用程序的数据或资源文件打包,方便分发给用户。
    • 归档旧文件:将不再频繁访问的文件压缩归档,节省存储空间。
  4. API 设计

    • 提供了简单的 API 来添加文件到 ZIP 归档,包括对文件的读取和写入。
    • 支持设置 ZIP 文件的注释和单个文件的注释。
    • 支持自定义压缩级别,以平衡压缩率和压缩速度。
  5. 与其他包的关联

    • 通常与 osiopath/filepath 等其他标准库包一起使用,以处理文件的路径、读取和写入操作。
  6. 易用性

    • 由于是标准库的一部分,archive/zip 包的 API 设计简洁直观,易于理解和使用。
  7. 社区支持

    • 作为 Go 语言的标准库之一,archive/zip 包得到了广泛的社区支持和维护,确保了其稳定性和可靠性。

通过 archive/zip 包,Go 语言开发者可以轻松地在他们的应用程序中实现文件压缩和归档的功能,无需依赖外部的压缩工具或库。

环境准备

对于使用Go语言和archive/zip包进行文件压缩的最小环境准备,以下内容是必需的:

  1. Go语言环境
    安装最新稳定版本的Go语言编译器和运行时环境。可以从Go语言官方网站下载安装包。

  2. 代码编辑器
    选择一个合适的代码编辑器或集成开发环境(IDE),如Visual Studio Code、GoLand、Atom等,它们支持Go语言的语法高亮、代码补全、错误检测等功能。

  3. 终端或命令提示符
    用于执行Go命令,如go mod init初始化模块、go build编译程序、go run运行程序等。

  4. 操作系统
    Go支持Windows、macOS、Linux等多种操作系统,根据你的开发需求选择合适的操作系统。

  5. Go Modules

    • 从Go 1.11版本开始,Go引入了模块支持,用于管理项目依赖。可以通过go mod命令来管理。
  6. 标准库文档

    • 访问Go语言的官方文档,特别是archive/zip包的文档,以便了解如何使用该包。

这些是进行Go语言开发和使用archive/zip包进行文件压缩所需的最基本的环境和工具。其他如版本控制工具、测试工具、构建工具等,虽然对开发过程很有帮助,但在最小化配置中不是必需的。

基础概念:

压缩和解压缩是数据存储和传输中常见的技术,它们可以有效地减少文件的体积,节省磁盘空间,加快数据传输速度。以下是压缩和解压缩的基本概念以及ZIP格式的特点:

压缩的基本概念:

  • 定义:压缩是将数据转换成更小体积的过程,通常用于减少文件大小,便于存储或传输。
  • 算法:压缩算法分为无损压缩和有损压缩。无损压缩允许完整恢复原始数据,而有损压缩则在压缩过程中可能会丢失部分数据,但通常用于图像和音频文件。
  • 类型:常见的无损压缩算法包括LZ77、LZ78、Deflate等。

解压缩的基本概念:

  • 定义:解压缩是将压缩后的数据恢复到原始大小的过程。
  • 目的:解压缩用于恢复压缩文件的原始内容,以便使用或进一步处理。

ZIP格式的特点:

  • 归档格式:ZIP是一种流行的归档文件格式,可以将多个文件和目录组织到一个单一的文件中。
  • 压缩:ZIP文件通常使用Deflate算法进行压缩,这是一种广泛使用的无损压缩算法。
  • 跨平台:ZIP格式被广泛支持,可以在多种操作系统和设备上使用。
  • 元数据保持:ZIP文件可以保持文件的元数据,如文件名、目录结构、时间戳等。
  • 加密:ZIP格式支持对文件进行加密,提供额外的安全性。
  • 注释:ZIP文件可以包含全局注释,以及每个文件的单独注释。
  • 多卷支持:ZIP文件可以分割成多个卷,适用于大文件的存储和传输。

ZIP文件的组成:

  • 中央目录:包含文件的元数据和压缩信息。
  • 文件头:每个文件在ZIP归档中的起始位置都有一个文件头,包含文件的基本信息。
  • 压缩数据:实际的压缩数据块。
  • 尾部:包含中央目录的结束记录,指示归档的结束。

使用ZIP的优点:

  • 兼容性:几乎所有现代操作系统都内置了对ZIP文件的支持。
  • 易用性:用户可以使用各种工具轻松创建和解压ZIP文件。
  • 效率:ZIP压缩算法在压缩效率和速度之间提供了良好的平衡。

理解压缩和解压缩的基本概念以及ZIP格式的特点,对于使用Go语言的archive/zip包进行文件压缩和解压操作非常重要。这有助于开发者在实现文件压缩功能时做出合理的设计决策。

使用 archive/zip 包进行文件压缩

以下是使用Go语言的archive/zip包来压缩文件的详细步骤和代码示例:

步骤 1: 引入必要的包

import ("archive/zip""io""os""path/filepath"
)

步骤 2: 创建ZIP归档

// 创建一个新的ZIP归档文件
zipFile, err := os.Create("example.zip")
if err != nil {panic(err)
}
defer zipFile.Close()// 创建一个zip.Writer
w := zip.NewWriter(zipFile)
defer w.Close()

步骤3:设置压缩级别

// 设置压缩级别,可选值有:
// zip.Store    (0) 存储模式,不进行压缩
// zip.Deflate  (-1) 默认压缩方法,通常提供较好的压缩率
// 其他值介于(-1, 9)之间,9为最高压缩率,但速度较慢
w.SetLevel(zip.Deflate) // 或者使用其他压缩级别

步骤 4: 添加文件到ZIP归档

// 遍历文件夹中的所有文件
err = filepath.Walk("path/to/directory", func(path string, info os.FileInfo, err error) error {if err != nil {return err}// 忽略目录if info.IsDir() {return nil}// 打开文件file, err := os.Open(path)if err != nil {return err}defer file.Close()// 为文件创建一个headerheader, err := zip.FileInfoHeader(info)if err != nil {return err}// 将文件路径设置为相对于给定目录的路径header.Name = filepath.ToSlash(path[len("path/to/directory"):])// 创建一个writerwriter, err := w.CreateHeader(header)if err != nil {return err}// 将文件内容写入到zip归档中_, err = io.Copy(writer, file)if err != nil {return err}return nil
})
if err != nil {panic(err)
}

步骤 5: 检查错误并关闭zip.Writer

// 检查zip.Writer是否有错误
if err := w.Close(); err != nil {panic(err)
}

完整示例代码

package mainimport ("archive/zip""io""os""path/filepath"
)func main() {// 要压缩的目录路径directoryPath := "path/to/directory"// 输出的zip文件名outputZipPath := "example.zip"// 创建ZIP文件zipFile, err := os.Create(outputZipPath)if err != nil {panic(err)}defer zipFile.Close()// 创建zip.Writerw := zip.NewWriter(zipFile)defer func() {if err := w.Close(); err != nil {panic(err)}}()// 设置压缩级别w.SetLevel(zip.Deflate) // 使用Deflate压缩方法// 遍历目录err = filepath.Walk(directoryPath, func(path string, info os.FileInfo, err error) error {if err != nil {return err}if info.IsDir() {return nil}file, err := os.Open(path)if err != nil {return err}defer file.Close()header, err := zip.FileInfoHeader(info)if err != nil {return err}// 计算相对路径header.Name, err = filepath.Rel(directoryPath, path)if err != nil {return err}header.Name = filepath.ToSlash(header.Name)writer, err := w.CreateHeader(header)if err != nil {return err}_, err = io.Copy(writer, file)return err})if err != nil {panic(err)}
}

请注意,这个示例代码将指定目录下的所有文件添加到ZIP归档中,包括子目录中的文件。filepath.Walk函数用于遍历目录,zip.FileInfoHeader用于创建文件的header,io.Copy用于将文件内容写入ZIP归档。最后,我们需要检查并关闭zip.Writer以确保所有数据都被写入。

使用 archive/zip 包进行文件解压缩

以下是使用Go语言的archive/zip包来解压缩ZIP文件的详细步骤和代码示例:

步骤 1: 引入必要的包

import ("archive/zip""io""os""path/filepath"
)

步骤 2: 打开ZIP归档文件

// 打开ZIP文件
zipFile, err := zip.OpenReader("example.zip")
if err != nil {panic(err)
}
defer zipFile.Close()

步骤 3: 遍历ZIP归档中的所有文件

// 遍历ZIP归档中的所有文件
for _, f := range zipFile.File {// 解析文件名filename, err := f.FileInfo().Name()if err != nil {panic(err)}// 根据文件名判断是目录还是文件if f.FileInfo().IsDir() {// 如果是目录,创建目录dirname := filepath.Join("destination_directory", filename)err = os.MkdirAll(dirname, f.FileInfo().Mode())if err != nil {panic(err)}} else {// 如果是文件,创建文件并解压fileToWrite, err := os.OpenFile(filepath.Join("destination_directory", filename), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.FileInfo().Mode())if err != nil {panic(err)}defer fileToWrite.Close()// 从ZIP归档中读取文件内容rc, err := f.Open()if err != nil {panic(err)}defer rc.Close()// 将内容写入到新文件_, err = io.Copy(fileToWrite, rc)if err != nil {panic(err)}}
}

步骤 4: 检查错误

// 检查并处理可能的错误
if err := zipFile.Close(); err != nil {panic(err)
}

完整示例代码

package mainimport ("archive/zip""io""os""path/filepath"
)func main() {// ZIP文件路径zipFilePath := "example.zip"// 解压到的目录destDirectory := "destination_directory"// 打开ZIP文件zipFile, err := zip.OpenReader(zipFilePath)if err != nil {panic(err)}defer zipFile.Close()// 确保目标目录存在err = os.MkdirAll(destDirectory, 0755)if err != nil {panic(err)}// 解压ZIP归档中的所有文件for _, f := range zipFile.File {filename := filepath.Join(destDirectory, f.FileInfo().Name())// 如果是目录,则创建目录if f.FileInfo().IsDir() {err := os.MkdirAll(filename, f.FileInfo().Mode())if err != nil {panic(err)}} else {// 如果是文件,则解压文件fileToWrite, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.FileInfo().Mode())if err != nil {panic(err)}defer fileToWrite.Close()rc, err := f.Open()if err != nil {panic(err)}defer rc.Close()_, err = io.Copy(fileToWrite, rc)if err != nil {panic(err)}}}// 检查并关闭ZIP文件if err := zipFile.Close(); err != nil {panic(err)}
}

这个示例代码展示了如何打开一个ZIP文件,遍历其中的所有文件和目录,并将它们解压到指定的目录。注意,我们使用了os.O_CREATEos.O_TRUNC标志来创建新文件或截断已存在的文件。io.Copy用于将ZIP归档中的文件内容写入到解压后的文件中。最后,我们检查并关闭了ZIP文件以确保释放资源。

总结

使用Go语言的标准库archive/zip进行文件的压缩和解压缩涉及到几个关键点,以下是对这些关键点的总结:

关键点总结

  1. 包引入

    • 导入archive/zip包以及其他可能需要的包,如osiopath/filepath
  2. 创建ZIP归档

    • 使用zip.Createzip.NewWriter创建一个新的ZIP归档文件。
  3. 添加文件

    • 通过遍历文件系统,使用zip.Writer.CreateHeader为每个文件创建一个header,并用io.Copy将文件内容写入ZIP归档。
  4. 设置压缩级别

    • 通过zip.Writer.SetLevel方法设置压缩级别,选择不同的压缩算法和级别。
  5. 错误处理

    • 检查每一步操作是否有错误发生,并进行相应的错误处理。
  6. 关闭资源

    • 完成操作后,调用zip.Writer.Close来关闭ZIP归档,确保所有数据都被写入。
  7. 读取ZIP归档

    • 使用zip.OpenReader打开一个ZIP归档,并遍历其内容。
  8. 解压文件

    • 对于ZIP归档中的每个文件,使用io.Copy将内容解压到指定路径。
  9. 并发处理(高级):

    • 利用Go的并发特性,通过goroutines并行处理多个文件的压缩或解压任务。
  10. 性能优化

    • 考虑I/O操作、CPU使用率、内存使用等因素,优化压缩和解压的性能。

参考资料

以下是关于Go语言的archive/zip包进行文件压缩和解压缩的参考资料索引编号:

  1. Golang 学习笔记(五)- archive/zip 实现压缩及解压
  2. Go 语言文件操作:读取压缩文件
  3. archive/zip - Go 语言标准库 - Go 语言 - API参考文档
  4. zip package - archive/zip - Go Packages

这些资料提供了对archive/zip包的使用方法、主要方法介绍、使用示例以及一些高级用法的详细说明。

呼吁行动

  • 鼓励亲自动手尝试示例代码。实践是学习编程的最佳方式。复制代码到您的编辑器中,尝试运行它们,并观察结果。
  • 不要害怕修改代码。尝试更改参数或逻辑,看看它们如何影响压缩和解压缩的过程和结果。
  • 如果在实践过程中遇到任何问题,不妨将它们提出来。您可以在技术论坛、社区或者博客文章下方的评论区提出您的问题。

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

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

相关文章

利用Arcgis绘制克吕金插值图

工作中我们常用到克吕金插值图,下面简单介绍下使用Arcmap绘制克吕金插值图的方法及注意事项,希望能帮到大家。 一、准备工作 软件:Arcgis 数据:点图层、研究范围 二、操作步骤 1 添加数据 打开Arcmap,从添加位置将…

JAVA数字化产科管理平台源码:涵盖了孕妇从建档、产检、保健、随访、分娩到产后42天全流程的信息化管理

JAVA数字化产科管理平台源码:涵盖了孕妇从建档、产检、保健、随访、分娩到产后42天全流程的信息化管理 智慧产科管理系统是基于自主研发妇幼信息平台,为医院产科量身打造的信息管理系统,涵盖了孕妇从建档、产检、保健、随访、分娩到产后42天全…

企商在线出席2024全球数字经济大会城市副中心论坛

2024年7月3日,2024全球数字经济大会城市副中心论坛“数字基础设施绿色创新发展分论坛”在北京市通州区成功举办。企商在线产品及解决方案总监孙杰受邀出席本次会议,并参与圆桌对话环节,分享“绿色”发展思路与经验。 2024全球数字经济大会城市…

身边有填报志愿需求别错过!张雪峰透露今年志愿填报技巧:报专业,别报行业!(文末附稳定高薪专业推荐)

高考填报志愿是每个考生和家长都要面对的重大抉择。在当前就业形势日趋严峻、部分行业发展前景不明朗的大背景下,考生在填报志愿时更需要全面了解各个专业的就业前景,理性权衡自身兴趣特长与社会需求,而不是盲目跟风报考所谓的"热门专业"。 今天跟大家分…

期权开户零门槛怎么操作?期权不满50w的开户方式

今天带你了解期权开户零门槛怎么操作?期权不满50w的开户方式。在股票期权市场上,期权交易是一种非常受欢迎的投资方式。它不仅可以增加投资组合的多样性,还可以为投资者提供一定的保护和利润机会,比如通过买入认股期权做空对冲大盘…

如何选择视频号矩阵系统:打造高效短视频内容生态的指南

在短视频内容创作和分发的热潮中,视频号矩阵系统作为一种高效的管理工具,受到了越来越多创作者和品牌的青睐。它通过集中管理多个视频号,优化内容发布流程,帮助用户提升工作效率和内容影响力。本文将探讨如何选择一个合适的视频号…

振弦采集仪的工程安全监测实践与案例分析

振弦采集仪的工程安全监测实践与案例分析 振弦采集仪是一种常用的工程安全监测仪器,通过测量被监测结构的振动频率与振型,可以实时监测结构的安全状况。本文将结合实践经验和案例分析,探讨振弦采集仪在工程安全监测中的应用。 一&#xff0c…

欢乐钓鱼大师游戏攻略:在什么地方掉称号鱼?云手机游戏辅助!

《欢乐钓鱼大师》是一款融合了休闲娱乐和策略挑战的钓鱼游戏。游戏中的各种鱼类不仅各具特色,而且钓鱼过程充满了挑战和乐趣。下面将为大家详细介绍如何在游戏中钓鱼,以及一些有效的钓鱼技巧,帮助你成为一个出色的钓鱼大师。 实用工具推荐 为…

io_contextttttttttttt

创建上下文——io_context_t 它是一个上下文结构,在内部它包含一个完成队列,在线程之间是可以共享的。 提交请求——iocb io回调数据结构,和io_submit配合使用。 处理结果 通过io_event处理结果, struct io_event {void *data…

【刷题汇总--Fibonacci数列、单词搜索、杨辉三角】

C日常刷题积累 今日刷题汇总 - day0041、Fibonacci数列1.1、题目1.2、思路1.3、程序实现 2、单词搜索2.1、题目2.2、思路2.3、程序实现 3、杨辉三角3.1、题目3.2、思路3.3、程序实现 - 蛮力法3.4、程序实现 - vector3.5、程序实现 - dp 4、题目链接 今日刷题汇总 - day004 1、…

【CUDA】 矩阵乘向量 matVecMul

Matrix - Vector Multiplication 矩阵-向量乘法是线性代数中的基本操作。它用于将一个矩阵与一个向量相乘。乘法的结果是与输入向量大小相同的向量。 矩阵和向量的乘法如图1所示。 图1 基础kernel与共享内存kernel 执行矩阵-向量乘法的基础kernel是使用单个线程执行输出向量…

【SOLID原则前端中的应用】开闭原则(Open/Closed Principle)- vue3示例

开闭原则(Open/Closed Principle)在Vue 3中的应用 开闭原则(Open/Closed Principle,OCP)规定,软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。 也就是说&#xf…

大型网站软件系统架构演进过程

在我们的生活中,通常会使用大型网站系统,比如购物网站淘宝,京东,阿里1688;大型搜索引擎网站百度,社交类的如腾讯旗下的微信,QQ及新浪旗下的微博等,他们通常都有一下特点: 高并发、大流量:这些系统必须能够处理成千上万甚至数百万的并发用户请求,以及持续…

Dubbo内部通信流程

我当时在学习的过程中搭建过demo,具体流程就是,我先定义了一个api接口模块,还定义一个服务提供者模块,然后服务提供方实现该接口,定义该方法具体的实现impl类,服务提供方启动时,将要暴露的服务和…

在线快速制作二维码的技巧,支持生成多种内容二维码

现在用二维码来分享内容是很多场景下会使用的一种方式,常见的展示内容有图片、文件、文本、音频、视频等,都可以生成二维码之后。通过手机扫码来查看内容,有利于内容的快速传播,并且用户获取信息也更加的方便。 下面来教大家使用…

Web应用防火墙用在哪些场景?

WAF是Web Application Firewall的缩写,翻译为“Web应用防火墙”是一种网络安全设备或服务,用于保护Web应用程序免受各种网络攻击和漏洞的影响。 WAF特别设计用于识别和阻止特定于Web应用程序的攻击,例如SQL注入、跨站脚本(XSS)、跨站请求伪造…

力扣习题--哈沙德数

一、前言 本系列主要讲解和分析力扣习题,所以的习题均来自于力扣官网题库 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台 二、哈沙德数 1. 哈沙德数 如果一个整数能够被其各个数位上的数字之和整除,则称之为 哈沙德数(Harshad number&…

CTF常用sql注入(二)报错注入(普通以及双查询)

0x05 报错注入 适用于页面无正常回显,但是有报错,那么就可以使用报错注入 基础函数 floor() 向下取整函数 返回小于或等于传入参数的最大整数。换句话说,它将数字向下取整到最接近的整数值。 示例: floor(3.7) 返回 3 floor(-2…

5.基于SpringBoot的SSMP整合案例-数据层开发

目录 1.新建项目 2.实体类开发: 2.1在pom.xml中增加Lombok坐标: 2.2添加Book实体类 3.数据层开发: 3.1 配置MyBatisPlus与Druid 3.2创建数据层接口 3.3写测试类 3.4点击运行: 4.数据层快速开发: 4.1配置MyB…

C++视觉开发 四.手势识别

本章记录传统手势识别,在表示0-5六个数值时的识别问题。例如识别剪刀石头布,手势,以及其表示的动作。在识别时将手势中的凹陷区域称为凸缺陷,其个数作为识别的重要依据。 需要注意,在凸缺陷个数为0时,无法…