Golang中字符串(string)与字节数组([]byte)一行代码互转实例
作者:猫轻王 发布时间:2023-09-17 14:37:07
标签:字符串,字节数组,互转
一、字符串与字节数组?
字符串是 Go 语言中最常用的基础数据类型之一,本质上是只读的字符型数组,虽然字符串往往都被看做是一个整体,但是实际上字符串是一片连续的内存空间。
Go 语言中另外一个类型字节(Byte)。在ASCII中,一个英文字母占一个字节的空间,一个中文汉字占两个字节的空间。英文标点占一个字节,中文标点占两个字节。一个Byte数组中的元素对应一个ASCII码。
二、详细代码
1.简单的方式字节转字符串
代码如下(示例):
func Bytes2String(data []byte) string {
return string(data)
}
2.简单的字符串转字节数组
代码如下(示例):
func String2Bytes(data string) []byte {
return []byte(data)
}
ps:以上两种简单的方式略过不提,主要实验 unsafe 正常转译
3.字节转字符串
代码如下(示例):
func BytesToString(data []byte) string {
return *(*string)(unsafe.Pointer(&data))
}
4.字符串转字节数组
代码如下(示例):
func StringToBytes(data string) []byte {
return *(*[]byte)(unsafe.Pointer(&data))
}
5.完整运行测试
代码如下(示例):
func BytesToString(data []byte) string {
return *(*string)(unsafe.Pointer(&data))
}
func StringToBytes(data string) []byte {
return *(*[]byte)(unsafe.Pointer(&data))
}
func main() {
str := "hello world!"
fmt.Println(str)
a := StringToBytes(str)
fmt.Println(a)
b := BytesToString(a)
fmt.Println(b)
}
结果(示例):
成功转译出Hello world!
补充:一些结论如下
string常量会在编译期分配到只读段,对应数据地址不可写入,并且相同的string常量不会重复存储。
fmt.Sprintf生成的字符串分配在堆上,对应数据地址可修改。
常量空字符串有数据地址,动态生成的字符串没有设置数据地址
Golang string和[]byte转换,会将数据复制到堆上,返回数据指向复制的数据
动态生成的字符串,即使内容一样,数据也是在不同的空间
只有动态生成的string,数据可以被黑科技修改
string和[]byte通过复制转换,性能损失接近4倍
来源:https://blog.csdn.net/moer0/article/details/122934188


猜你喜欢
- ctypes(一) — 初识 很多初学Python的新手,总是嘴边挂着一句话:“Python是一门胶水语言”。可是究竟什
- 先了解什么是deferGo语言中的defer与return执行的先后顺序Go语言的 defer 语句会将其后面跟随的语句进行延迟处理,在 d
- 网络上有很多关于语言选择的问题,其中关于Python和Java的问题大抵如下:Python和Java该如何选择 ?将来Python(Java
- 突然想到了之前一直没留意的for循环中开goroutine的执行顺序问题,就找了段代码试了试,试了几次后发现几个有意思的地方,我暂时没有精力
- RIFF file formatRIFF全称为资源互换文件格式(Resources Interchange File Format),是Wi
- Js代码:vartempForm=document.createElement("form"); tempF
- 今天再为大家提供一种方法:不需要安装Excel也可以导入到我们的SQL Server数据库。首先用SQL Server自身的数据转换功能把E
- 学习前言……又看了很久的SSD算法,今天讲解一下训练部分的代码。预测部分的代码可以参照https
- 如果要得到返回值,需要用Command的方法。 首先说明,返回值有两种。一种是在存储过程中直接return一个值,就象C和VB的函数返回值那
- 最新在学习Python的基础入门系列课程,今天学习到使用python 的内置库smtplib发送邮件内容。使用Python发送邮件步骤简单:
- 前言🥂上一篇文章说完MySQL的事务和锁了,这次来详细介绍一下在MySQL中一条更新语句的详细执行流程 (本文无特殊说明均是采用Innodb
- 层的八条定律当然,这些并非真正的定律,而只是一些有益的忠告,使你免陷于使用层时可能的困顿中。原来有九条定律的,我们精简掉一条,还有下面的八条
- 写了网址规范化后,尚奇公司的柳先生建议再深入讨论一下301转向/重定向。下面就谈谈我所了解的301转向在搜索引擎优化方面的应用。什么是301
- 目录模板基本语法编写主页模板准备虚拟数据渲染主页模板总结在一般的 Web 程序里,访问一个地址通常会返回一个包含各类信息的 HTML 页面。
- 一、张量定义张量:TensorFlow的张量是n维数组,类型为tf.Tensor。标量:一个数字 (0阶张量)向量:一维数组 (1阶张量)矩
- 前言Python 中一切皆对象,这些对象的内存都是在运行时动态地在堆中进行分配的,就连 Python 虚拟机使用的栈也是在堆上模拟的。既然一
- 原文地址第一次翻译文章,请各路人士多多指教!类型和接口因为映射建设在类型的基础之上,首先我们对类型进行全新的介绍。go是一个静态性语言,每个
- 两组字符串数据,需要比较其中相同的数据,并将其值相加并组成一个新的字符串数据a1="sp2=20;sp1=34;"a2=
- github主页导入:>>> from fuzzywuzzy import fuzz>>> from f
- 目录一、Python字典1.什么是字典2.字典的创建方式2.1 通过其他字典创建2.2 通过关键字参数创建2.3 通过键值对的序列创建2.4