快速理解Go数组和切片的内部实现原理

RyuGou · · 1948 次点击
10楼 <a href="/user/thelongnight" title="@thelongnight">@thelongnight</a> 切片本身是值传递,内部指向数组的指针是引用。 二个不同的切片指向同一个数组,使用不同的切片打印数组的内容。 给你个例子如下: ``` func listappend(list []int) { h := (*[3]uintptr)(unsafe.Pointer(&amp;list)) fmt.Println(&#34;++++&#34;, h[0], h[1], h[2], &amp;h[0], &amp;h[1], &amp;h[2], list) list = append(list, 1) fmt.Println(&#34;++++&#34;, h[0], h[1], h[2], &amp;h[0], &amp;h[1], &amp;h[2], list) } func TestList(t *testing.T) { test1 := make([]int, 0, 8) test1 = append(test1, 1) h := (*[3]uintptr)(unsafe.Pointer(&amp;test1)) fmt.Println(&#34;----&#34;, h[0], h[1], h[2], &amp;h[0], &amp;h[1], &amp;h[2], test1) listappend(test1) fmt.Println(&#34;----&#34;, h[0], h[1], h[2], &amp;h[0], &amp;h[1], &amp;h[2], test1) } ``` 输出结果是: ``` ---- 824634286208 1 8 0xc000056480 0xc000056488 0xc000056490 [1] ++++ 824634286208 1 8 0xc0000564e0 0xc0000564e8 0xc0000564f0 [1] ++++ 824634286208 2 8 0xc0000564e0 0xc0000564e8 0xc0000564f0 [1 1] ---- 824634286208 1 8 0xc000056480 0xc000056488 0xc000056490 [1] ``` 指向同一个数组地址:824634286208 但是切片的地址不是用一个。 test1结构体的指针分别是:0xc000056480 0xc000056488 0xc000056490 list结构体的指针分别是: 0xc0000564e0 0xc0000564e8 0xc0000564f0
#12
更多评论
faceNL
公众号: 面向奶酪
模板大佬!!!
#1
polaris
社区,需要你我一同完善!
csdn 图片做了防盗链,所以,你直接把 图片 地址放这里看不到~ :joy:
#2