您现在的位置是:首页 > 编程 > 

《Go小技巧&易错点100例》第二十六篇

2025-07-25 21:55:46
《Go小技巧&易错点100例》第二十六篇 本期分享:1. string转[]byte是否会发生内存拷贝2. Go程序获取文件的哈希值正文:string转[]byte是否会发生内存拷贝在Go语言中,字符串转换为字节数组([]byte)确实会发生内存拷贝。这是因为在Go中,字符串是不可变的,而字节数组是可变的。字符串的内部表示是一个只读的字节序列,而字节数组是一个可写的字节序列。因此,将字符串

《Go小技巧&易错点100例》第二十六篇

本期分享

1. string转[]byte是否会发生内存拷贝

2. Go程序获取文件的哈希值


正文

string转[]byte是否会发生内存拷贝

在Go语言中,字符串转换为字节数组([]byte)确实会发生内存拷贝。这是因为在Go中,字符串是不可变的,而字节数组是可变的。字符串的内部表示是一个只读的字节序列,而字节数组是一个可写的字节序列。因此,将字符串转换为字节数组时,需要将字符串中的字节内容复制到新的字节数组空间中。

内存拷贝的影响

性能影响:内存拷贝会增加一些开销,尤其是在处理非常大的字符串时。虽然现代计算机处理这种操作通常非常快,但在性能敏感的应用中,这可能是一个需要考虑的因素。

内存使用:由于需要分配新的内存空间来存储字节数组,因此会增加内存的使用量。这可能会导致更高的内存占用和潜在的垃圾回收压力。

示例代码

下面是一个简单的示例,展示了如何将字符串转换为字节数组,并解释内存拷贝的过程:

代码语言:go复制
func TestStringToByteArray(t *testing.T) {
	// 定义一个字符串
	str := "Hello, World!"

	// 将字符串转换为字节数组
	byteArray := []byte(str)

	// 打印字符串和字节数组的内容
	fmt.Println("String:", str)
	fmt.Println("Byte Array:", byteArray)

	// 打印字符串和字节数组的内存地址
	fmt.Printf("Address of string data: %p\n", unsafe.Pointer(&str))
	fmt.Printf("Address of byte array: %p\n", unsafe.Pointer(&byteArray))

	// 修改字节数组中的元素,验证它是独立的副本
	byteArray[0] = 'h'
	fmt.Println("Modified Byte Array:", byteArray)
	fmt.Println("String after modification (should be unchanged):", str)
}

输出:

代码语言:shell复制
String: Hello, World!
Byte Array: [72 101 108 108 111 44 2 87 111 114 108 100 ]
Address of string data: 0xc000024500
Address of byte array: 0xc000008228
Modified Byte Array: [104 101 108 108 111 44 2 87 111 114 108 100 ]
String after modification (should be unchanged): Hello, World!

strbyteArray 的内容在转换后是一样的,但它们的内存地址是不同的,这证明了内存拷贝的发生,并且修改 byteArray 的第一个元素不会影响到 str,因为 byteArraystr 的一个独立副本。

总结

在Go中,将字符串转换为字节数组会触发内存拷贝,这会影响性能和内存使用。在大多数情况下,这种开销是可以接受的,但在性能敏感的应用中,需要仔细考虑这种转换的代价。

Go程序获取文件的哈希值

计算文件的哈希值在多个领域和场景中有着广泛的应用,主要用途为以下几点:

1)完整性校验:哈希值可以作为文件的唯一标识,用于检测文件在传输或存储过程中是否被篡改或损坏。在下载文件时,常见的做法是从可靠来源获取文件的哈希值,并在下载完成后计算文件的哈希值进行比对,以确保文件的完整性。

2)去重与快速查:哈希值可以用于快速判断两个文件是否相同,因为相同的文件会产生相同的哈希值。在处理大量文件时,可以使用哈希值进行去重操作,或者构建哈希表来加速查过程。

)数字签名:哈希值可以作为数字签名的一部分,用于验证文件的来源和完整性。发送方对文件计算哈希值,并使用私钥对哈希值进行加密生成数字签名。接收方使用发送方的公钥解密数字签名,并重新计算文件的哈希值进行比对,以验证文件的真实性和完整性。

4)密码学应用:在密码学领域,哈希值可以用于实现各种安全机制,如密码存储(使用哈希算法存储密码的哈希值而不是明文密码)、消息认证码(MAC)等。

5)分布式系统:在分布式系统中,哈希值可以用于数据分片和负载均衡。例如,可以将数据文件的哈希值作为键,根据哈希值将数据分配到不同的节点上。

6)版本控制:在软件开发中,哈希值可以用于版本控制,以跟踪文件的变化。每次文件更新时,都会计算新的哈希值,并与之前的哈希值进行比对,以确定文件是否已被修改。

那么在Go语言如何计算文件的哈希值?

代码:

代码语言:go复制
func CalculateFileHash(filePath string) (string, error) {
	file, err := os.Open(filePath)
	if err != nil {
		return "", err
	}
	defer func() {
		_ = file.Close()
	}()

	hash := ()
	if _, err := io.Copy(hash, file); err != nil {
		return "", err
	}

	hashInBytes := hash.Sum(nil)[:2] // SHA-256 produces a 2 byte hash
	return fmt.Sprintf("%x", hashInBytes), nil
}

测试用例:

代码语言:go复制
func TestCalculateFileHash(t *testing.T) {
	hash, err := CalculateFileHash("hello.go")
	if err != nil {
		t.Error(err)
	}
	fmt.Println(hash) 
}

可以发现在修改文件内容前后文件的哈希值会发送变化。

本篇结束~

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1206752.html

相关标签:无
上传时间: 2025-07-24 11:26:00
留言与评论(共有 18 条评论)
本站网友 不可抗力广播剧
21分钟前 发表
接收方使用发送方的公钥解密数字签名
本站网友 三藩市
29分钟前 发表
[72 101 108 108 111 44 2 87 111 114 108 100 ] Address of string data
本站网友 叉出去
19分钟前 发表
2)去重与快速查:哈希值可以用于快速判断两个文件是否相同
本站网友 大凉
21分钟前 发表
虽然现代计算机处理这种操作通常非常快
本站网友 天安车险怎么样
7分钟前 发表
并使用私钥对哈希值进行加密生成数字签名
本站网友 文县吧
5分钟前 发表
而字节数组是一个可写的字节序列
本站网友 青岛万达影城
28分钟前 发表
这种开销是可以接受的
本站网友 中国美债
18分钟前 发表
以确保文件的完整性
本站网友 windowsupdate
26分钟前 发表
并重新计算文件的哈希值进行比对
本站网友 迈克菲怎么卸载
8分钟前 发表
接收方使用发送方的公钥解密数字签名
本站网友 儿童白癜风
9分钟前 发表
err } hashInBytes
本站网友 海南房地产网
3分钟前 发表
"
本站网友 梦见朋友怀孕
20分钟前 发表
这证明了内存拷贝的发生
本站网友 壮阳最好的四大中成药
28分钟前 发表
哈希值可以用于实现各种安全机制
本站网友 无罪推定
0秒前 发表
= hash.Sum(nil)[
本站网友 金砖之国下载
28分钟前 发表
2] // SHA-256 produces a 2 byte hash return fmt.Sprintf("%x"
本站网友 油价上调时间
11分钟前 发表
这是因为在Go中