• 引用 就是变量的另一名字,不在内存中单独存储
    • 指针 存储变量的地址,可以改变指向

      1. int main() {
      2. int a = 10;// 变量
      3. int * pa = &a; // 指针
      4. int & b = a; // 引用
      5. printf("a: %d\n", a);// a: 10
      6. printf("*pa: %d\n", *pa);// *pa: 10
      7. printf("b: %d\n", b);// b: 10
      8. *pa = 20;
      9. printf("a: %d\n", a);// a: 20
      10. printf("*pa: %d\n", *pa);// *pa: 20
      11. printf("b: %d\n", b);// b: 20
      12. b = 30;
      13. printf("a: %d\n", a);// a: 30
      14. printf("*pa: %d\n", *pa);// *pa: 30
      15. printf("b: %d\n", b);// b: 30
      16. a = 40;
      17. printf("a: %d\n", a);// a: 40
      18. printf("*pa: %d\n", *pa);// *pa: 40
      19. printf("b: %d\n", b);// b: 40
      20. return 0;
      21. }

      image.png
      golang 函数是值传递(拷贝副本,内存地址不同),没有引用传递。
      map, chan 返回指针类型;
      slicemapchan都不太一样的,一样的是,它也是引用类型,它也可以在函数中修改对应的内容。
      slice是一种结构体+元素指针的混合类型,通过元素array(Data)的指针,可以达到修改slice里存储元素的目的。 ```go type SliceHeader struct { Data uintptr Len int Cap int }

    type slice struct { array unsafe.Pointer len int cap int } ``` 内置函数 new 计算类型大小,为其分配零值内存,返回指针。而 make 会被编译器翻译 成具体的创建函数,由其分配内存和初始化成员结构,返回对象而非指针。

    make 用来创建map、slice、channel
    new 用来创建值类型