04【保姆级】-GO语言指针

之前我学过C、Java、Python语言时总结的经验:

  1. 先建立整体框架,然后再去抠细节。
  2. 先Know how,然后know why。
  3. 先做出来,然后再去一点点研究,才会事半功倍。
  4. 适当的囫囵吞枣。因为死抠某个知识点很浪费时间的。
  5. 对于GO语言,切记遵守语法格式规则。(例如python语言、例如SpringBoot框架等)
    解释:某些知识点,就是很难了解,那么先做出来,然后继续向前学习,可能在某个时间点我们就会恍然大悟。

04【保姆级】-GO语言指针

  • 一、指针的概念
    • 1.1 基本数据类型 && 指针类型
    • 1.2 指针的详细讲解
      • 指针内存图
      • 练习题
  • 二、 值类型和引用类型【面试题】
    • 2.1 值类型
    • 2.2 引用类型
    • 2.3值类型和引用类型的使用特点

一、指针的概念

1.1 基本数据类型 && 指针类型

  1. 基本数据类型,变量存的就是值,也就是值类型。
  2. 而指针类型,指针变量存的是一个地址,这个地址对应的空间存的是值。例如:【var ptr *int = &num】

1.2 指针的详细讲解

  1. 获取变量的地址,用&,比如:【var num int】 ,其中获取num的地址是:【&num】
  2. 获取指针类型所指向的值,使用【*】,比如【var ptr *int】,使用【*ptr】获取ptr指向的值。
	// 基本数据类型:
	var num int = 100
	fmt.Println("num =", num) 		//  num = 100

	// 指针类型:
	var ptr *int = &num
	fmt.Println("num的地址是:", &num)  //  num的地址是: 0xc04205a080
	fmt.Println("ptr存储的是num的地址:", ptr)  //  ptr存储的是num的地址: 0xc04205a08
	fmt.Println("ptr指针指向的变量内容:", *ptr)  //  ptr指针指向的变量内容: 100


- 解释var ptr *int = *num
1. ptr 是一个指针变量
2. ptr 的类型是*int 
3. ptr 本身的值&num

指针内存图

04【保姆级】-GO语言指针_第1张图片

练习题

  1. 第一个是错误的,因为不能将变量直接赋值给指针。正确的是将变量的内存地址赋值给指针。
  2. 第二个是错的。是因为类型不匹配。
  3. 第三个正确。前面a的值通过指针进行了更改,后面 指针指向了b。
    04【保姆级】-GO语言指针_第2张图片

二、 值类型和引用类型【面试题】

2.1 值类型

  1. 值类型:都有对应的之类类型,形式为【*数据类型】,比如int的对应指针就是【*int】
  2. 值类型包括: 基本数据类型 int系列、float系列,bool,string,数组和结构体struct

2.2 引用类型

引用类型:指针、slice切片、map、管道chan、interface等

2.3值类型和引用类型的使用特点

  1. 值类型:变量直接存储值,内存通常在栈中分配。
    04【保姆级】-GO语言指针_第3张图片

  2. 应用类型:变量存储的是一个地址,这个地址对应的空间才真正存储数据(也就是值),内存通常在堆上分配,当没有任何变量引用这个地址时,该地址对应的数据空间就成了一个垃圾,由GC来回收。
    04【保姆级】-GO语言指针_第4张图片

  3. 内存的栈区和堆区示意图:

04【保姆级】-GO语言指针_第5张图片

你可能感兴趣的:(golang,开发语言)