将[]byte转换为字符串的最佳实践是什么?

huangapple go评论67阅读模式
英文:

Go []byte to string conversion best practice

问题

在Go语言中,将字节数组转换为字符串有两种方法。下面是这两种方法的区别和性能比较:

方法1:

func convert(myBytes []byte) string {
   myString := string(myBytes[:])
   return myString
}

这种方法使用了切片操作符[:]将字节数组转换为字符串。它是一种简单直接的方法。

方法2:

func convert(b []byte) string {
	return *((*string)(unsafe.Pointer(&b)))
}

这种方法使用了unsafe包中的指针操作,将字节数组的指针转换为字符串的指针,然后再解引用得到字符串。这种方法更加底层,使用了不安全的指针操作。

性能比较:
通常情况下,方法1的性能更好,因为它是一种标准的、安全的方式来进行字节数组到字符串的转换。方法2使用了不安全的指针操作,可能会导致一些潜在的问题,并且在某些情况下可能会比方法1慢。

建议使用:
一般情况下,建议使用方法1,因为它更加简单、安全,并且具有良好的性能。只有在特殊情况下,需要对性能进行极致优化时,才考虑使用方法2。

英文:

Online I have seen two methods converting a byte array to a string in Go.
Method 1:

func convert(myBytes byte[]) string {
   myString := string(myBytes[:])
   return myString
}

Method 2:

func convert(b []byte) string {
	return *((*string)(unsafe.Pointer(&b)))
}

What is the difference? Which one is faster? Which one should I use?

答案1

得分: 4

第一种形式将字节切片复制到一个新的数组,并创建一个指向该数组的字符串。第二种形式创建一个指向给定字节切片的字符串。

第一种形式是安全的,但需要进行复制操作。第二种形式是不安全的,如果你修改了给定字节切片的内容,程序将会出现难以诊断的错误,因为字符串应该是不可变的。但它不需要进行复制操作。

这很不可能成为瓶颈。数组复制是一个快速的操作。使用第一种版本。

英文:

The first form copies the byte slice to a new array, and creates a string pointing to that. The second one creates a string pointing to the given byte slice.

The first one is safe, but has a copy operation. The second one is unsafe, and the program will break with hard to diagnose errors if you ever modify the contents of the given byte slice, because strings are supposed to be immutable. But it does not have a copy operation.

It is very unlikely that this is a bottleneck. Array copy is a fast operation. Use the first version.

huangapple
  • 本文由 发表于 2022年10月4日 14:33:42
  • 转载请务必保留本文链接:https://go.coder-hub.com/73943902.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定