初级会员
  • 第 36326 位会员
  • knowledgebao
  • knowledgebao
  • 2019-05-07 08:55:19
  • Offline
  • 20 7

最近发布的主题

    暂无

最近发布的文章

    暂无

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • #10 @thelongnight 切片本身是值传递,你所谓的引用是指向的底层数组是引用
  • #10 @thelongnight 切片本身是值传递,内部指向数组的指针是引用。 二个不同的切片指向同一个数组,使用不同的切片打印数组的内容。 给你个例子如下: ``` func listappend(list []int) { h := (*[3]uintptr)(unsafe.Pointer(&list)) fmt.Println("++++", h[0], h[1], h[2], &h[0], &h[1], &h[2], list) list = append(list, 1) fmt.Println("++++", h[0], h[1], h[2], &h[0], &h[1], &h[2], list) } func TestList(t *testing.T) { test1 := make([]int, 0, 8) test1 = append(test1, 1) h := (*[3]uintptr)(unsafe.Pointer(&test1)) fmt.Println("----", h[0], h[1], h[2], &h[0], &h[1], &h[2], test1) listappend(test1) fmt.Println("----", h[0], h[1], h[2], &h[0], &h[1], &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
  • 10楼 @thelongnight 切片本身是值传递,内部指向数组的指针是引用。 二个不同的切片指向同一个数组,使用不同的切片打印数组的内容。 给你个例子如下: ``` func listappend(list []int) { h := (*[3]uintptr)(unsafe.Pointer(&list)) fmt.Println("++++", h[0], h[1], h[2], &h[0], &h[1], &h[2], list) list = append(list, 1) fmt.Println("++++", h[0], h[1], h[2], &h[0], &h[1], &h[2], list) } func TestList(t *testing.T) { test1 := make([]int, 0, 8) test1 = append(test1, 1) h := (*[3]uintptr)(unsafe.Pointer(&test1)) fmt.Println("----", h[0], h[1], h[2], &h[0], &h[1], &h[2], test1) listappend(test1) fmt.Println("----", h[0], h[1], h[2], &h[0], &h[1], &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
  • #5 @thelongnight test1和list是二个不同的slice。
  • #5 @thelongnight 因为test1的len一直是0,slice作为参数,len和cap是值传递。