算法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