脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - Golang中字符串(string)与字节数组([]byte)一行代码互转实例

Golang中字符串(string)与字节数组([]byte)一行代码互转实例

2022-11-21 12:22猫轻王 Golang

golang语言本身就是c的工具集,开发c的程序用到的大部分结构体,内存管理,携程等,golang基本都有,下面这篇文章主要给大家介绍了关于Golang中字符串(string)与字节数组([]byte)一行代码互转的相关资料,需要的朋友可以参考下

一、字符串与字节数组?

字符串是 Go 语言中最常用的基础数据类型之一,本质上是只读的字符型数组,虽然字符串往往都被看做是一个整体,但是实际上字符串是一片连续的内存空间。

Go 语言中另外一个类型字节(Byte)。在ASCII中,一个英文字母占一个字节的空间,一个中文汉字占两个字节的空间。英文标点占一个字节,中文标点占两个字节。一个Byte数组中的元素对应一个ASCII码。

二、详细代码

1.简单的方式字节转字符串

代码如下(示例):

?
1
2
3
func Bytes2String(data []byte) string {
    return string(data)
}

2.简单的字符串转字节数组

代码如下(示例):

?
1
2
3
func String2Bytes(data string) []byte {
    return []byte(data)
}

ps:以上两种简单的方式略过不提,主要实验 unsafe 正常转译

3.字节转字符串

代码如下(示例):

?
1
2
3
func BytesToString(data []byte) string {
    return *(*string)(unsafe.Pointer(&data))
}

4.字符串转字节数组

代码如下(示例):

?
1
2
3
func StringToBytes(data string) []byte {
    return *(*[]byte)(unsafe.Pointer(&data))
}

5.完整运行测试

代码如下(示例):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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)
}

结果(示例):

Golang中字符串(string)与字节数组([]byte)一行代码互转实例

成功转译出Hello world!

补充:一些结论如下

  1. string常量会在编译期分配到只读段,对应数据地址不可写入,并且相同的string常量不会重复存储。
  2. fmt.Sprintf生成的字符串分配在堆上,对应数据地址可修改。
  3. 常量空字符串有数据地址,动态生成的字符串没有设置数据地址
  4. Golang string和[]byte转换,会将数据复制到堆上,返回数据指向复制的数据
  5. 动态生成的字符串,即使内容一样,数据也是在不同的空间
  6. 只有动态生成的string,数据可以被黑科技修改
  7. string和[]byte通过复制转换,性能损失接近4倍

总结

两个方法来记住字节数组与字符串互转,简单直接,实用性拉满。

到此这篇关于Golang中字符串(string)与字节数组([]byte)一行代码互转的文章就介绍到这了,更多相关Golang字符串与字节数组互转内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/moer0/article/details/122934188

延伸 · 阅读

精彩推荐
  • GolangGo语言的代码组织结构详细介绍

    Go语言的代码组织结构详细介绍

    这篇文章主要介绍了Go语言的代码码组织结构详细介绍,即Go语言源码的文件结构,本文讲解了包、main和main.main、os包等内容,需要的朋友可以参考下 ...

    junjie8062020-04-03
  • GolangGolang gRPC HTTP协议转换示例

    Golang gRPC HTTP协议转换示例

    这篇文章主要为大家介绍了Golang gRPC HTTP协议转换示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    Coldstar12002022-10-21
  • GolangGo Struct 初始化风格的抉择

    Go Struct 初始化风格的抉择

    最近在对之前的代码做重构,从之前的 MVC 结构切换到 Clean Arch 的结构,但是在切换的时候关于代码风格出现了一些困惑。...

    Mohuishou2712020-11-23
  • Golang浅析Go语言中的Range关键字

    浅析Go语言中的Range关键字

    Range是go语言中很独特的一个关键词,也相当好用。下面就跟着小编来再聊聊这个Range关键字,有需要的朋友们可以参考借鉴。 ...

    daisy3082020-05-03
  • Golang使用go语言实现查找两个数组的异同操作

    使用go语言实现查找两个数组的异同操作

    这篇文章主要介绍了使用go语言实现查找两个数组的异同操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    御前带刀程序猿11242021-02-28
  • GolangGoLang之使用Context控制请求超时的实现

    GoLang之使用Context控制请求超时的实现

    这篇文章主要介绍了GoLang之使用Context控制请求超时的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋...

    MACdress7002020-06-08
  • Golanggo语言开发环境安装及第一个go程序(推荐)

    go语言开发环境安装及第一个go程序(推荐)

    这篇文章主要介绍了go语言开发环境安装及第一个go程序,这篇通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 ...

    低调码农哥6182020-06-03
  • Golang使用Go defer要小心这2个雷区!

    使用Go defer要小心这2个雷区!

    大家担心如果循环过大 defer 链表会巨长,不够 “精益求精”。又或是猜想会不会 Go defer 的设计和 Redis 数据结构设计类似,自己做了优化,其实没啥大影响...

    脑子进煎鱼了9312021-04-24