算法Go语言描述📌datastruct📌1_array&string.txt
数组(Array)是一种线性表数据结构,用一组连续的内存空间来存储一组具有相同类型的数据。
在Go语言中数组是一个值类型,而不是一个指向数组内存起始位置的指针,也不能和同类型的指针进行转化。
所有的值类型变量在赋值和作为参数传递时都将产生一次复制动作。
在Go语言里,切片是一种灵活、动态的序列,它基于数组实现。
type slice struct {
array unsafe.Pointer // 指向底层数组的指针
len int // 切片的长度
cap int // 切片的容量
}
在Go语言里,字符串是一种不可变的字节序列,通常用于存储文本数据。
type stringStruct struct {
str unsafe.Pointer // 指向底层字节数组的指针
len int // 字符串的长度(字符串中字节的数量)
}
字符串和字节数组的互转一般直接使用数据类型转换的方法:s=string([]byte) b=[]byte(string)
只要是发生变量数据类型转换都会发生内存拷贝。通过指针共享可以实现零拷贝转换:
func StringToBytes(s string) []byte {
return *(*[]byte)(unsafe.Pointer(
&struct {
string
int
}{s, len(s)},
))
}
func BytesToString(b []byte) string {
return *(*string)(unsafe.Pointer(&b))
}
或(v1.20+):
func StringToBytes(s string) []byte {
return unsafe.Slice(unsafe.StringData(s), len(s))
}
func BytesToString(b []byte) string {
return unsafe.String((*byte)(unsafe.SliceData(b)), len(b))
}
注意!这种转换是不安全的,由于字符串是不可变的,因此对其底层字节数组的赋值操作将会导致异常退出:
unexpected fault address