使用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 博客专家、华为云社区云享专家、签约作者,欢迎关注我分享更多干货!😄

目录
相关文章
|
13天前
|
Go
Go 语言循环语句
在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。
24 1
|
2天前
|
存储 Go 容器
深入探究Go语言中的数据结构
深入探究Go语言中的数据结构
10 3
|
12天前
|
Go 开发者
探索Go语言的并发之美
在Go语言的世界里,"并发"不仅仅是一个特性,它是一种哲学。本文将带你领略Go语言中goroutine和channel的魔力,揭示如何通过Go的并发机制来构建高效、可靠的系统。我们将通过一个简单的示例,展示如何利用Go的并发特性来解决实际问题,让你的程序像Go一样,轻盈而强大。
|
13天前
|
JSON Go API
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
|
13天前
|
Go
go语言创建字典
go语言创建字典
|
14天前
|
安全 Go 数据处理
探索Go语言的并发之美:Goroutines与Channels
在Go语言的世界里,"并发"不仅仅是一个概念,它是一种生活的方式。本文将带你领略Go语言中Goroutines和Channels的魔力,它们是如何让并发编程变得既简单又高效。我们将通过一个简单的示例,展示如何使用这些工具来构建一个高性能的网络服务。
|
14天前
|
关系型数据库 Go 数据处理
高效数据迁移:使用Go语言优化ETL流程
在本文中,我们将探索Go语言在处理大规模数据迁移任务中的独特优势,以及如何通过Go语言的并发特性来优化数据提取、转换和加载(ETL)流程。不同于其他摘要,本文不仅展示了Go语言在ETL过程中的应用,还提供了实用的代码示例和性能对比分析。
|
14天前
|
Go 定位技术 索引
Go 语言Map(集合) | 19
Go 语言Map(集合) | 19
|
14天前
|
Go
go语言注释,标识符 | 17
go语言注释,标识符 | 17
|
13天前
|
NoSQL Go API
go语言操作Redis
go语言操作Redis