试图了解如何在 Go 中重命名字节数组

Posted

技术标签:

【中文标题】试图了解如何在 Go 中重命名字节数组【英文标题】:Trying to understand how to rename a byte array in Go 【发布时间】:2022-01-13 15:19:25 【问题描述】:

我正在尝试根据条件逻辑重新分配字节数组。我不明白我的选择。代码如下:

s3Buffer, numBytes, err :=  DownloadS3File(event.S3Bucket, event.S3ObjectID, session)

header, err = GetHeader(s3Buffer)

var outBuffer []byte

if HeaderIndicatesConversionNeeded(header) 
    outBuffer, err = ConvertBuffer(s3Buffer, event.ObjectID)
 else 
    // outBuffer = s3Buffer or copy(outBuffer, s3Buffer) or outBuffer = *s3Buffer or ??


// use outBuffer...

我需要让 outBuffer 与 s3Buffer 相同,这是一个包含我下载的 s3 对象内容的字节数组。复制命令似乎不合逻辑,但更直接。我已经阅读了几天的 Go 教程,但我无法弄清楚这一点。我对 Go 很陌生,所以我可能会在这里做一些非常错误的事情,我承认。

【问题讨论】:

【参考方案1】:

outBuffer = s3Buffer 将复制切片头,但不会复制实际数据。这是最快的并且完全没问题,只要知道在这个赋值之后两个变量都将指向相同的数据,所以通过它们中的任何一个修改数据都会反映在另一个变量上。见Are slices passed by value?

copy() 如果您想将一个切片与另一个切片“分离”,这很有用。请注意,copy() 还需要您预先分配目标切片,因为它不再复制源中可用的内容以及可以复制到目标的内容(它复制len(src)len(dst) 的最小值)。详情见Why can't I duplicate a slice with `copy()`?

作为copy() 的替代方案,您可以使用内置的append() 函数。它将元素附加到一个切片上,这些元素可能是另一个切片的元素;但是——不像copy()——append() 在需要时负责空间分配。它看起来像:

outBuffer = append(outBuffer, s3Buffer...)

阅读博文以了解有关切片的更多信息:

Go Slices: usage and internals

Arrays, slices (and strings): The mechanics of 'append'

【讨论】:

这是我没看懂的! copy() 给我留下了一个空字节数组,大概是因为我刚刚声明了它,并且没有使用 make() 来分配空间。我希望我能理解你在说什么。我试试看! 是的!它奏效了,我学到了一些东西! copy() 不为目标缓冲区分配空间。我认为它是愚蠢的。非常感谢@icza!

以上是关于试图了解如何在 Go 中重命名字节数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在Go中将字节数组转换为字符串[重复]

如何在Bash中重命名关联数组?

golang 在go中创建一个字节数组

GO中常用包笔记 bytes

GO中常用包笔记 bytes

golang 在go中将字节数组转换为int