Go语言的概念记忆模型

die*_*_K3 4 go

我向你们中的Go程序员提问.我找不到有关Go内存模型细节的信息.我将尝试描述我的问题:

如果我在C中声明并定义一个变量或数组,我知道它存在于RAM的某个位置,只有一个特定的地址,直到我做了一些会改变它的东西.

这不是Python中的情况:Python为我做了整个内存管理,我不能确定我的数据总是位于一个位置.例如,字符串在实践中是不可变的,即使语言表明它们不是.这使得使用敏感数据的安全编程几乎不可能(或者至少非常不切实际).

我的问题是:Go如何从这个角度开展工作.它更像是C还是像Python一样?还是完全不同?是否可以像在C中一样舒适地处理敏感数据?

Von*_*onC 6

注意:如" Go Slices:usage and internals "中所述:

内存中的表示[4]int只是顺序排列的四个整数值:

http://blog.golang.org/go-slices-usage-and-internals_slice-array.png

Go的数组是值.

数组变量表示整个数组; 它不是指向第一个数组元素的指针(如C中的情况).这意味着当您分配或传递数组值时,您将复制其内容.
(为了避免复制,你可以传递指向数组的指针,但那是指向数组的指针,而不是数组.)

考虑数组的一种方法是作为一种结构,但使用索引而不是命名字段:固定大小的复合值.

如果您正在查看"指向数组的指针",那么您需要一个切片.

切片是数组段的描述符.它由指向数组的指针,段的长度及其容量(段的最大长度)组成.

我们s之前创建的变量的make([]byte, 5)结构如下:

http://blog.golang.org/go-slices-usage-and-internals_slice-1.png

对于数组和切片的内存分配方式,您可以查看" Effective Go "

Go有两个分配原语,内置函数newmake.
他们做不同的事情并适用于不同的类型,这可能令人困惑,但规则很简单.

  • 我们来谈谈新的第一个.它是一个内置函数,可以分配内存,但与其他语言中的名称不同,它不会初始化内存,它只会将内存归零.
    也就是说,new(T)为新的类型项分配归零存储T并返回其地址,即类型值*T.
    在Go术语中,它返回一个指向新分配的类型零值的指针T.

  • 配置make:内置功能make(T, args)有不同的用途new(T).它仅创建切片,贴图和通道,并返回类型T(非*T)的初始化(未归零)值.
    区别的原因是这三种类型在封面下表示对在使用前必须初始化的数据结构的引用.
    例如,切片是一个三项描述符,包含指向数据的指针(在数组内),长度和容量,并且在初始化这些项之前,切片为零.

有关详细信息,请参阅" 了解指针和内存分配 ".