之前我学过C、Java、Python语言时总结的经验:
- 先建立整体框架,然后再去抠细节。
- 先Know how,然后know why。
- 先做出来,然后再去一点点研究,才会事半功倍。
- 适当的囫囵吞枣。因为死抠某个知识点很浪费时间的。
- 对于GO语言,切记遵守语法格式规则。(例如python语言、例如SpringBoot框架等)
解释:某些知识点,就是很难了解,那么先做出来,然后继续向前学习,可能在某个时间点我们就会恍然大悟。
04【保姆级】-GO语言指针
- 一、指针的概念
- 1.1 基本数据类型 && 指针类型
- 1.2 指针的详细讲解
- 指针内存图
- 练习题
- 二、 值类型和引用类型【面试题】
- 2.1 值类型
- 2.2 引用类型
- 2.3值类型和引用类型的使用特点
一、指针的概念
1.1 基本数据类型 && 指针类型
- 基本数据类型,变量存的就是值,也就是值类型。
- 而指针类型,指针变量存的是一个地址,这个地址对应的空间存的是值。例如:【var ptr *int = &num】
1.2 指针的详细讲解
- 获取变量的地址,用&,比如:【var num int】 ,其中获取num的地址是:【&num】
- 获取指针类型所指向的值,使用【*】,比如【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
指针内存图
练习题
- 第一个是错误的,因为不能将变量直接赋值给指针。正确的是将变量的内存地址赋值给指针。
- 第二个是错的。是因为类型不匹配。
- 第三个正确。前面a的值通过指针进行了更改,后面 指针指向了b。
二、 值类型和引用类型【面试题】
2.1 值类型
- 值类型:都有对应的之类类型,形式为【*数据类型】,比如int的对应指针就是【*int】
- 值类型包括: 基本数据类型 int系列、float系列,bool,string,数组和结构体struct
2.2 引用类型
引用类型:指针、slice切片、map、管道chan、interface等
2.3值类型和引用类型的使用特点
-
值类型:变量直接存储值,内存通常在栈中分配。
-
应用类型:变量存储的是一个地址,这个地址对应的空间才真正存储数据(也就是值),内存通常在堆上分配,当没有任何变量引用这个地址时,该地址对应的数据空间就成了一个垃圾,由GC来回收。
-
内存的栈区和堆区示意图: