使用Golang语言实现对指定存储桶的删除方法(下)

简介: 上一篇文章《使用Golang语言实现对指定存储桶的删除方法(上)》中介绍了删除存储桶前的校验逻辑,今天就来看一看,具体删除存储桶时的逻辑处理。通过上下两篇文章的介绍基本上就把删除存储桶的底层源码实现讲清楚了。正文我们直接进入正题,当删除存储桶时,大概需要三个层逻辑。具体情况,我们接下来单独介绍。

前言

上一篇文章《使用Golang语言实现对指定存储桶的删除方法(上)》中介绍了删除存储桶前的校验逻辑,今天就来看一看,具体删除存储桶时的逻辑处理。通过上下两篇文章的介绍基本上就把删除存储桶的底层源码实现讲清楚了。

正文

我们直接进入正题,当删除存储桶时,大概需要三个层逻辑。具体情况,我们接下来单独介绍。

第一层

存储桶中一般会包含存储的文件,我们在删除存储桶的时候,首先要删除存储的文件。我们通过查询数据库,查看当前存储桶中都包含哪些存储文件,然后根据查询结果再逐一删除。

代码实现:先调用ListObjectsV2()查询存储的文件,再调用删除接口RemoveObject()

第二层

存储桶中还有可能会包含正在上传的文件,比如大文件一般都是分片上传的,有可能正上传了一半停止了。在删除存储文件时,也要考虑删除这部分中间文件。同样,我们先查询数据库中未完成上传的记录,再根据这些查询结果删除中间的临时文件。

代码实现:先调用ListIncompleteUploads()查询未完成上传的文件,再调用删除接口RemoveIncompleteUpload

第三层

删除存储桶中所有的文件和临时文件后,就可以删除存储桶本身了。最后,删除数据库中的存储桶记录。

代码实现:调用接口RemoveBucket删除存储桶。

逻辑汇总加代码实现

定义删除方法:cleanupBucket,参数是存储桶名称,类型是字符串。具体逻辑代码实现如下:

funccleanupBucket(bucketNamestring) error {
// 创建协程doneCh :=make(chanstruct{})
// 退出后清理资源deferclose(doneCh)
// 迭代查询结果forobjCh :=rangeListObjectsV2(bucketName, "", true, doneCh) {
ifobjCh.Err!=nil {
returnobjCh.Err        }
ifobjCh.Key!="" {
// 删除存储桶中的文件err :=RemoveObject(bucketName, objCh.Key)
iferr!=nil {
returnerr            }
        }
    }
// 查询未完成上传的文件,也就我们说的中间文件、临时文件forobjPartInfo :=rangeListIncompleteUploads(bucketName, "", true, doneCh) {
ifobjPartInfo.Err!=nil {
returnobjPartInfo.Err        }
ifobjPartInfo.Key!="" {
// 删除未完成上传的文件err :=RemoveIncompleteUpload(bucketName, objPartInfo.Key)
iferr!=nil {
returnerr            }
        }
    }
// 最后,删除存储桶自己err :=RemoveBucket(bucketName)
iferr!=nil {
returnerr    }
returnerr}

好了,至此,删除存储桶的底层代码逻辑实现就介绍完了。看完了之后,是不是有很多点是自己之前所没有想到的。

结尾

通过学习删除存储桶的底层代码实现,有没有感觉像发现了新大陆。尽管平时我们自己不去实现这些代码,但是其中的思想有很多可以借鉴的地方。今天的内容就介绍完了,我是 liuzhen007, 欢迎评论留言外加“一键三连”。

题外话

今天不得不再说点别的,细心的小伙伴会发现,我这个月每天都在更新文章,而且在每篇文章的最后都会附上一个打卡截图。今天是这个月的最后一天,8月更文挑战,今天就算完成了。哈哈,特意在此记录一下。今天是一个活动的结束,也是新活动的起点,继续加油!奥力给!



作者简介:😄大家好,我是 Data-Mining(liuzhen007),是一位音视频技术爱好者,前后就职于传统广电巨头和音视频互联网公司,具有丰富的音视频直播和点播相关经验,对 WebRTC、FFmpeg 和 Electron 有非常深入的了解,😄公众号:玩转音视频。同时也是 CSDN 博客专家、华为云社区云享专家、签约作者,欢迎关注我分享更多干货!😄

目录
相关文章
|
2月前
|
存储 监控 算法
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
92 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
|
2月前
|
存储 Go 索引
go语言中数组和切片
go语言中数组和切片
47 7
|
2月前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
1天前
|
Go C语言
Go语言入门:分支结构
本文介绍了Go语言中的条件语句,包括`if...else`、`if...else if`和`switch`结构,并通过多个练习详细解释了它们的用法。`if...else`用于简单的条件判断;`if...else if`处理多条件分支;`switch`则适用于基于不同值的选择逻辑。特别地,文章还介绍了`fallthrough`关键字,用于优化重复代码。通过实例如判断年龄、奇偶数、公交乘车及成绩等级等,帮助读者更好地理解和应用这些结构。
27 14
|
2月前
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
119 71
|
2月前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
120 67
|
15天前
|
存储 监控 算法
内网监控系统之 Go 语言布隆过滤器算法深度剖析
在数字化时代,内网监控系统对企业和组织的信息安全至关重要。布隆过滤器(Bloom Filter)作为一种高效的数据结构,能够快速判断元素是否存在于集合中,适用于内网监控中的恶意IP和违规域名筛选。本文介绍其原理、优势及Go语言实现,提升系统性能与响应速度,保障信息安全。
25 5
|
25天前
|
算法 安全 Go
Go语言中的加密和解密是如何实现的?
Go语言通过标准库中的`crypto`包提供丰富的加密和解密功能,包括对称加密(如AES)、非对称加密(如RSA、ECDSA)及散列函数(如SHA256)。`encoding/base64`包则用于Base64编码与解码。开发者可根据需求选择合适的算法和密钥,使用这些包进行加密操作。示例代码展示了如何使用`crypto/aes`包实现对称加密。加密和解密操作涉及敏感数据处理,需格外注意安全性。
41 14
|
25天前
|
Go 数据库
Go语言中的包(package)是如何组织的?
在Go语言中,包是代码组织和管理的基本单元,用于集合相关函数、类型和变量,便于复用和维护。包通过目录结构、文件命名、初始化函数(`init`)及导出规则来管理命名空间和依赖关系。合理的包组织能提高代码的可读性、可维护性和可复用性,减少耦合度。例如,`stringutils`包提供字符串处理函数,主程序导入使用这些函数,使代码结构清晰易懂。
70 11
|
25天前
|
存储 安全 Go
Go语言中的map数据结构是如何实现的?
Go 语言中的 `map` 是基于哈希表实现的键值对数据结构,支持快速查找、插入和删除操作。其原理涉及哈希函数、桶(Bucket)、动态扩容和哈希冲突处理等关键机制,平均时间复杂度为 O(1)。为了确保线程安全,Go 提供了 `sync.Map` 类型,通过分段锁实现并发访问的安全性。示例代码展示了如何使用自定义结构体和切片模拟 `map` 功能,以及如何使用 `sync.Map` 进行线程安全的操作。