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

目录
  • 一、字符串与字节数组?
  • 二、详细代码
    • 1.简单的方式字节转字符串
    • 2.简单的字符串转字节数组
    • 3.字节转字符串
    • 4.字符串转字节数组
    • 5.完整运行测试
  • 补充:一些结论如下
  • 总结

一、字符串与字节数组?

字符串是 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!

补充:一些结论如下

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

总结

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

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

(0)

相关推荐

  • Golang 字符串与字节数组互转的实现

    目录 一.字符串与字节数组? 二.详细代码 1.字节转字符串 2.字符串转字节数组 3.完整运行测试 总结 一.字符串与字节数组? 字符串是 Go 语言中最常用的基础数据类型之一,本质上是只读的字符型数组,虽然字符串往往都被看做是一个整体,但是实际上字符串是一片连续的内存空间. Go 语言中另外一个类型字节(Byte).在ASCII中,一个英文字母占一个字节的空间,一个中文汉字占两个字节的空间.英文标点占一个字节,中文标点占两个字节.一个Byte数组中的元素对应一个ASCII码. 二.详细代码

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

    目录 一.字符串与字节数组? 二.详细代码 1.简单的方式字节转字符串 2.简单的字符串转字节数组 3.字节转字符串 4.字符串转字节数组 5.完整运行测试 补充:一些结论如下 总结 一.字符串与字节数组? 字符串是 Go 语言中最常用的基础数据类型之一,本质上是只读的字符型数组,虽然字符串往往都被看做是一个整体,但是实际上字符串是一片连续的内存空间. Go 语言中另外一个类型字节(Byte).在ASCII中,一个英文字母占一个字节的空间,一个中文汉字占两个字节的空间.英文标点占一个字节,中文标

  • 在VBS中定义字节数组Byte()介绍

    晚上在 QQ 上看到昵称为"乱码"的好友回答了搜搜问问里一个问题: 在VBS中有办法定义字节数组么? 在VBS中有办法定义字节数组么?就是字节子类型数组(VarType是8209的那种)注意不是VB! 但是回答实在是不堪入目,连别人问什么都没搞懂,而且那人居然还满意,真不知道他在想什么. 闲来没事,我来简单回答一下.首先要搞清楚别人在问什么,VBS 是弱类型脚本语言,只有一种数据类型,称为 Variant,但是 Variant 可以进一步分为几种子类型,这里不展开,详见<VBSc

  • 浅谈javascript中字符串String与数组Array

    简单点就是string是字符(串)... 而array是数组...可以放数字啊,字符啊等一系列东东!!! 上个示例: 复制代码 代码如下: var str = "liuzhanqi"; document.write(str["length"]);//等价str.l ength  var str = string.fromcharcode(72, 101, 108, 108, 111, 33); document.write(str); //各整数作为unicode编

  • 详解Golang中字符串的使用

    目录 1.字符串编码 2.字符串遍历 3.字符串中的字符数 4.字符串trim 5.字符串连接 6.字节切片转字符串 1.字符串编码 在go中rune是一个unicode编码点. 我们都知道UTF-8将字符编码为1-4个字节,比如我们常用的汉字,UTF-8编码为3个字节.所以rune也是int32的别名. type rune = int32 当我们打印一个英文字符hello的时候,我们可以得到s的长度为5,因为英文字母代表1个字节: package main import "fmt"

  • C#使用文件流FileStream和内存流MemoryStream操作底层字节数组byte[]

    一.Stream类概述 在.NET Framework中,文件和流是有区别的. 文件是存储在磁盘上的数据集,它具有名称和相应的路径.当打开一个文件并对其进行读/写时,该文件就称为流(stream). 但是,流不仅仅是指打开的磁盘文件,还可以是网络数据..Net Framework允许在内存中创建流.此外,在控制台应用程序中,键盘输入和文本显示都是流. 1. Stream类 Stream类是所有流的抽象基类. Stream类的主要属性有CanRead.CanWrite(是否支持读取写入).CanS

  • C#实现字符串转换成字节数组的简单实现方法

    本文实例讲述了C#实现字符串转换成字节数组的简单实现方法.分享给大家供大家参考.具体实现方法如下: using System.Text; public static byte[] ConvertStringToByteArray(string stringToConvert) { return (new UnicodeEncoding()).GetBytes(stringToConvert); } 希望本文所述对大家的C#程序设计有所帮助.

  • Python中字符串String的基本内置函数与过滤字符模块函数的基本用法

    首先我们要明白在python中当字符编码为:UTF-8时,中文在字符串中的占位为3个字节,其余字符为一个字节 下面就直接介绍几种python中字符串常用的几种字符串内置函数(本文中牵扯到了模块与一些之前章节没讲过的相关知识,坑我之后会填的) 字符串切片(截取字符串): #字符串切片 string[开始位置:结束位置:步长] name = "巩祎鹏"print(name[0:]) #从第一个字符截取到最后一个字符 print(name[0:2]) #从第一个字符截取到第二个字符 prin

  • golang中字符串MD5生成方式总结

    方案一 func md5V(str string) string { h := md5.New() h.Write([]byte(str)) return hex.EncodeToString(h.Sum(nil)) } 方案二 func md5V2(str string) string { data := []byte(str) has := md5.Sum(data) md5str := fmt.Sprintf("%x", has) return md5str } 方案三 func

  • 浅析Golang中字符串拼接问题

    目录 1.概述 2.Golang中字符串拼接的方式 3.总结 1.概述 Go的字符串是一个不可改变的数据结构,这和其他语言如JAVA,C++等的设定很类似.总体来说,有如下五种拼接方式,下面我们将论述各种方式的性能问题,以及如何选择. (golang字符串,内存模型) type StringHeader struct { Data uintptr Len int } 注意:字符串具有不可改变的特性,即便通过指针等变相操作 var a string = "old" bptr := (*r

  • ES6中字符串string常用的新增方法小结

    本文实例讲述了ES6中字符串string常用的新增方法.分享给大家供大家参考,具体如下: ES6为js新增了很多方法,包括遍历.查询.替换等等,可以很简洁的替换ES5中的类似方法,本文不考虑codePointAt等不常用方法. for-of: let str="wbiokr"; for(let s of str){ console.log(s) } //结果:w, b, i, o, k, r 由于es5并没有为js制定字符串相关遍历方法,for-of无疑会是接下来前端开发中的一个很重要

随机推荐