一个字符串在内存中究竟什么样子? C语言字符串是一个字节数组加一个结束符。Go语言字符串标准结构是指针和长度,指针指向一个字节数组。 数组
好比说多我的使用同一个字符串的时候或者字符串在不一样函数中传递的时候,但愿要么复制、要么不可变。这样的好处是无论引用多少次,只须要保留一份副本。当对其进行修改的时候就建立一个新的。 数据结构
数组是一个由固定长度的特定类型元素组成的序列,一个数组能够由零个或多个元素组成。数组的长度是数组类型的组成部分。Go语言中数组是值语义,一个数组变量即表示整个数组,它并非隐式的指向第一个元素的指针(好比C语言的数组),而是一个完整的值。当一个数组变量被赋值或者被传递的时候,实际上会复制整个数组。若是数组较大的话,数组的赋值也会有较大的开销。为了不复制数组带来的开销,能够传递一个指向数组的指针,可是数组指针并非数组。函数
切片是一个很简单的对数组进行管理的数据结构,可是它自己并非数组,它经过一个指针引用一个数组,自己显然不是数组,是一个结构体。因此咱们返回切片类型大小的时候,sizeof(type)其实是三个字段相加的结果而不是它引用数组的长度。指针
Go语言中数组、字符串和切片三者是密切相关的数据结构。这三种数据类型,在底层有着相同的内存结构,在上层,由于语法的限制而有着不一样的行为表现。首先,Go语言的数组是一种值类型,虽然数组的元素能够被修改,可是数组自己的赋值和函数传参都是以总体复制的方式处理的。Go语言字符串底层也是对应的字节数组,可是字符串的只读属性禁止了在程序对底层字节数组元素的修改。字符串赋值只是复制了数据地址和对应的长度,而不会致使底层数据的复制。切片的行为更为灵活,切片的结构和字符串结构相似,可是解除了只读限制。切片的底层数据虽然也是对应数据类型的数组,可是每一个切片还有独立的长度和容量信息,切片赋值和函数传参数时也是将切片头信息部分按传值方式处理。由于切片头含有底层数据的指针,因此它的赋值也不会致使底层数据的复制。cdn