Go中的数组是否有价值?

Isa*_*aac 5 arrays deep-copy go

package main

import (
  "fmt"
)

func main() {
  var a = [5]int{1,2,3,4,5}
  b := a
  b[4] = 100
  fmt.Println(a,b) //[1 2 3 4 5] [1 2 3 4 100]
}
Run Code Online (Sandbox Code Playgroud)

从上面做一个测试,Go中的数组似乎是通过值而不是引用传递的.那么我可以得出结论,在Go中处理这样的问题时,没有概念shallow-copying也没有deep-copying必要吗?

pet*_*rSO 8

Go编程语言规范

数组类型

数组是单个类型的元素的编号序列,称为元素类型.元素的数量称为长度,绝不是负数.

长度是数组类型的一部分; 它必须求值为由int类型值表示的非负常量.可以使用内置函数len发现数组a的长度.元素可以通过整数索引0到len(a)-1来寻址.

切片类型

切片是底层数组的连续段的描述符,并提供对该数组中编号的元素序列的访问.切片类型表示其元素类型的所有数组切片的集合.未初始化切片的值为零.

与数组一样,切片是可索引的并且具有长度.切片s的长度可以通过内置函数len发现; 与数组不同,它可能在执行期间发生变化 元素可以通过整数索引0到len(s)-1来寻址.给定元素的切片索引可能小于底层数组中相同元素的索引.

一旦初始化,切片始终与保存其元素的基础数组相关联.因此,切片与其阵列和同一阵列的其他切片共享存储; 相比之下,不同的数组总是代表不同的存储.

切片下面的阵列可以延伸超过切片的末端.容量是该程度的度量:它是切片长度和切片之外的阵列长度的总和; 可以通过从原始切片中切割出新的切片来创建长度达到该容量的切片.可以使用内置功能上限(a)发现切片a的容量.


您应该将Go数组与Go切片进行比较.赋值复制数组值.赋值复制切片描述符值.切片描述符是一个结构,具有长度,容量和指向其基础切片数组的指针.

type slice struct {
    array unsafe.Pointer
    len   int
    cap   int
}
Run Code Online (Sandbox Code Playgroud)

例如,

package main

import "fmt"

func main() {
    // array
    var a = [5]int{1, 2, 3, 4, 5}
    b := a
    b[4] = 100
    fmt.Println(a, b)

    // slice
    var s = []int{1, 2, 3, 4, 5}
    t := s
    t[4] = 100
    fmt.Println(s, t)
}
Run Code Online (Sandbox Code Playgroud)

游乐场:https://play.golang.org/p/8eFa1Mod_Kj

输出:

[1 2 3 4 5] [1 2 3 4 100]
[1 2 3 4 100] [1 2 3 4 100]
Run Code Online (Sandbox Code Playgroud)