Yug*_*ang 3 arrays pointers go slice
我想探讨一下当我们尝试复制变量时如何分配内存.我做了一些测试,这个让我困惑:
func testArrayAddress() {
var a [3]int
b := a
fmt.Printf("address of a %p and of b %p \n", &(a[0]), &(b[0]))
}
Run Code Online (Sandbox Code Playgroud)
输出是:
address of a 0xc8200126e0 and of b 0xc820012700
Run Code Online (Sandbox Code Playgroud)
但是,当我假设a和b并指向同一个数组时,第一个元素的起始地址应该相同?
这使我怀疑当我们执行声明时发生了什么b := a?原本我以为它只是分配一个内存块时,我们初始化变量数组a,并b := a使得b指向同一个内存位置,但随后它无法解释为什么第一个元素的地址是不一样的(这应该是相同的元素) .
我改变了第一行代码:
func testArrayAddress() {
var a = []int{1, 2, 3}
b := a
fmt.Printf("address of a's first element %p and of b %p \n", &(a[0]), &(b[0]))
}
Run Code Online (Sandbox Code Playgroud)
然后输出是:
address of a's first element 0xc8200126e0 and of b 0xc8200126e0
Run Code Online (Sandbox Code Playgroud)
它现在给了我相同的结果.
我想问的问题是:
在Golang中,当我们做变量copy(b := a)时,我们是否也在内存中创建数据副本?对于不可变类型和可变类型都是一样的吗?
如果我们也在复制可变类型(例如数组),它如何设法实现修改变量也会影响其他人(a[0] = 42会影响b[0])?
如何[]int键入不同[number]int,我在最后一种情况下测试的类型?
数组表示其所有元素,当传递它或分配它时,它的所有元素都被复制.
切片是指向底层数组的连续部分的小型结构式描述符.传递或分配时,仅复制此标头(包括指针),因此"新"切片将指向相同的后备阵列.
要回答您的确切问题:
是,b := a复制所有元素if if a是一个数组,但只有标题if a是一个切片.只要只有1个goroutine访问(修改)a,两者都是安全的,如果多个goroutine可以修改它们,则没有一个是安全的.
如果复制一个数组,它将完全独立于"原始",修改副本将对原始数据没有影响.如果复制了切片,则副本将指向存储元素的相同后备阵列.如果通过复制切片修改元素,则修改唯一元素,因此通过原始切片检查它,您只需检查元素的唯一"实例"(并观察修改后的值).
这是第一句话:[]int是一个切片,[n]int是一个数组.
查看相关问题:
为什么Go中有数组?
Golang将数组传递给函数并进行修改
阅读以下博客文章,了解有关切片和数组的更多详细信息:
Go Slices:用法和内部
数组,切片(和字符串):'追加'的机制
| 归档时间: |
|
| 查看次数: |
92 次 |
| 最近记录: |