Go小技巧易错点100例(二十六)

news2025/4/15 10:37:06

请在此添加图片描述

本期分享

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

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


正文

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

在Go语言中,字符串转换为字节数组([]byte)确实会发生内存拷贝。这是因为在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)
}

输出:

String: Hello, World!
Byte Array: [72 101 108 108 111 44 32 87 111 114 108 100 33]
Address of string data: 0xc000024500
Address of byte array: 0xc000008228
Modified Byte Array: [104 101 108 108 111 44 32 87 111 114 108 100 33]
String after modification (should be unchanged): Hello, World!

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

总结

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

Go程序获取文件的哈希值

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

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

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

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

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

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

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

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

代码:

func CalculateFileHash(filePath string) (string, error) {
	file, err := os.Open(filePath)
	if err != nil {
		return "", err
	}
	defer func() {
		_ = file.Close()
	}()

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

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

测试用例:

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

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

本篇结束~

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

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

相关文章

FPGA_BD Block Design学习(一)

PS端开发流程详细步骤 1.第一步:打开Vivado软件,创建或打开一个工程。 2.第二步:在Block Design中添加arm核心,并将其配置为IP核。 3.第三步:配置arm核心的外设信息,如DDR接口、时钟频率、UART接口等。 …

ubuntu20.04+qt5.12.8安装serialbus

先从官网https://download.qt.io/archive/qt/5.12/5.12.8/submodules/ 下载 qtserialbus-everywhere-src-5.12.8.tar.xz 有需要其他版本的点击返回上一级自行寻找对应版本。 也可从 https://download.csdn.net/download/zhouhui1982/90595810 下载 在终端中依次输入以下命令…

如何查看自己抖音的IP属地?详细教程+常见问题解答

在当今互联网时代,IP属地信息已成为各大社交平台(如抖音、微博、快手等)展示用户真实网络位置的重要功能。无论是出于隐私保护、账号安全,还是单纯好奇自己的IP归属地,了解如何查看抖音IP属地都很有必要。 本文将详细介…

⑪数据中心网络M-LAG实战

一、DeviceA-M-LAG-Mater配置 1、M-LAG 系统配置。 # m-lag mad exclude interface GigabitEthernet1/0/7 m-lag mad exclude interface Vlan-interface100 m-lag mad exclude interface Vlan-interface101 m-lag system-mac 0002-0002-0002 m-lag system-number 1 m-la…

化工企业数字化转型:从数据贯通到生态重构的实践路径

一、战略定位:破解行业核心痛点 化工行业面临生产安全风险高(全国危化品企业事故率年增5%)、能耗与排放压力大(占工业总能耗12%)、供应链协同低效(库存周转率低于制造业均值30%)三大挑战。《石…

JAVA——初识JAVA

文章目录 如何在cmd上编译、运行代码解析String[] args中放的是什么Java结构编译运行可能遇到的错误Java中的注释Java的三种注释编码不一致的问题 IDEA常用基础开发快捷键补齐快捷键注释快捷键 IDEA的基础调式方法标识符 如何在cmd上编译、运行 在没有集成开发环境下&#xff…

Shell脚本的学习

编写脚本文件 定义以开头:#!/bin/bash #!用来声明脚本由什么shell解释,否则使用默认shel 第一步:编写脚本文件 #!/bin/bash #注释 echo "这是输出" 第二步:加上执行权限:chmod x 脚本文件名.sh 第三步&…

专题十四:动态路由——OSPF

一、OSPF简介 开放式最短路径优先OSPF(Open Shortest Path First)是IETF组织开发的一个基于链路状态的内部网关协议(Interior Gateway Protocol),采用DIjkstra算法,协议号是89。用于自治系统(A…

Cocos Creator Shader入门实战(八):Shader实现圆形、椭圆、菱形等头像

引擎:3.8.5 您好,我是鹤九日! 回顾 Shader的学习是一条漫长的道路。 理论知识的枯燥无味,让很多人选择了放弃。然而不得不说:任何新知识、新领域的学习,本身面临的都是问题! 互联网和AI给了我…

【AI论文】VCR-Bench:视频链式思考推理的综合评估框架

摘要:思想链(CoT)推理的进步显著增强了大型语言模型(LLMs)和大型视觉语言模型(LVLMs)的能力。 然而,目前仍然缺乏一个严格的视频CoT推理评估框架。 目前的视频基准测试无法充分评估推…

数据中台、BI业务访谈(二):组织架构梳理的坑

这是数据中台、BI业务访谈系列的第二篇文章,在上一篇文章中,我重点介绍了在给企业的业务部门、高层管理做业务访谈之前我们要做好行业、业务知识的功课。做好这些功课之后,就到了实际的访谈环节了。 业务访谈关键点 那么在具体业务访谈的时…

【零基础实战】Ubuntu搭建DVWA漏洞靶场全流程详解(附渗透测试示例)

【零基础实战】Ubuntu搭建DVWA漏洞靶场全流程详解(附渗透测试示例) (声明:实际操作请遵守网络安全法,仅在授权环境进行测试,仅供个人研究) 一、DVWA靶场简介 DVWA(Damn Vulnerable Web Application)是专为网络安全学习者设计的漏洞演练平台,包含SQL注入、XSS、文件…

库学习04——numpy

一、基本属性 二、 创建数组 (一)arange a np.arange(10,20,2) # [10,12,14,16,18] 只有一个参数n的话,默认是从0到n-1的一维数组。 (二)自定义reshape a np.arange(12).reshape((3,4)) [[ 0 1 2 3][ 4 5 …

Win10系统安装WSL2-Ubuntu, 并使用VScode开始工作

本教程基于博主当前需要使用 WSL2(Windows Subsystem for Linux 2) 而编写,将自己使用的经过分享给大家。有什么意见建议敬请大家批评指正。此过程需要打开 Microsoft Store 话不多说,立即开始~ 文章目录 1. 检查系统版本2. 启动 WSL 功能3. 安装Ubuntu4…

SLAM(七)-卡尔曼滤波

SLAM(七)-卡尔曼滤波 一、卡尔曼滤波(KF)二、扩展卡尔曼滤波(EKF)三、误差状态卡尔曼滤波(ESKF) 参考《概率机器人》、《Principles of GNSS,lnertial and Multisensor lntegrated Navigation Systems (Second Edition)》 一、卡尔曼滤波(KF)…

如何解决DDoS攻击问题 ?—专业解决方案深度分析

本文深入解析DDoS攻击面临的挑战与解决策略,提供了一系列防御技术和实践建议,帮助企业加强其网络安全架构,有效防御DDoS攻击。从攻击的识别、防范措施到应急响应,为网络安全工作者提供了详细的操作指引。 DDoS攻击概览&#xff1a…

Windows for Redis 后台服务运行

下载 redis 安装包 地址:https://github.com/tporadowski/redis/releases 解压zip压缩包,执行 redis-server.exe 即可以窗口模式运行(窗口关闭则服务关闭) 运行窗口可以看到,端口是 6379 我这里使用 nvaicat 客服端测…

C语言超详细指针知识(二)

在上一篇有关指针的博客中,我们介绍了指针的基础知识,如:内存与地址,解引用操作符,野指针等,今天我们将更加深入的学习指针的其他知识。 1.指针的使用和传址调用 1.1strlen的模拟实现 库函数strlen的功能是…

华为机试—最大最小路

题目 对于给定的无向无根树&#xff0c;第 i 个节点上有一个权值 wi​ 。我们定义一条简单路径是好的&#xff0c;当且仅当&#xff1a;路径上的点的点权最小值小于等于 a &#xff0c;路径上的点的点权最大值大于等于 b 。 保证给定的 a<b&#xff0c;你需要计算有多少条简…

[Linux]从零开始的ARM Linux交叉编译与.so文件链接教程

一、前言 最近在项目需要将C版本的opencv集成到原本的代码中从而进行一些简单的图像处理。但是在这其中遇到了一些问题&#xff0c;首先就是原本的opencv我们需要在x86的架构上进行编译然后将其集成到我们的项目中&#xff0c;这里我们到底应该将opencv编译为x86架构的还是编译…