一、指针基本介绍

1、对于基本数据类型,变量存储的就是值,也叫值类型。

2、获取变量的地址,用&。eg:

package main

import (
	"fmt"
)

func main() {
	var num int = 100
	fmt.Println("num的地址=", &num)
}

//输出结果:num的地址= 0xc0000a6058

3、指针变量存储的值是一个地址,这个地址指向的空间中存储值。

4、获取指针类型所指向的值*。通过 *指针变量访问对应地址中的值。eg:

package main

import (
	"fmt"
)

func main() {
	var num int = 100
	fmt.Println("num的地址=", &num)

	var ptr *int = &num
	fmt.Println("获取ptr所指向的值 *ptr = ", *ptr)
}

//输出结果:
// num的地址= 0xc00000e088
// 获取ptr所指向的值 *ptr =  100

二、指针的简单使用

通过指针修改变量值,eg:

package main

import (
	"fmt"
)

func main() {
	var num int = 100
	fmt.Println("num的地址=", &num)

	var ptr *int = &num
	fmt.Println("获取ptr所指向的值 *ptr = ", *ptr)

	//修改值
	*ptr = 99
	fmt.Println("num的新值=", num)
}

//输出结果:
// num的地址= 0xc0000a6058
// 获取ptr所指向的值 *ptr =  100
// num的新值= 99

指针类型不匹配报错:

package main

import (
	"fmt"
)

func main() {
	var num int = 100
	var ptr *float64 = &num
}

报错提示如下:

三、使用细节

1、使用指针时需要注意数据类型的匹配。int对应的指针类型就是 * int,float64对应的指针类型就是 * float64
2、值类型,都有对应的指针类型,形式为 *数据类型

四、值类型和引用类型

1、值类型包括:基本数据类型int系列、float系列、bool、string;数组和结构体struct。
2、引用类型包括:指针、slice切片、map、管道chan、接口interface等。

值类型引用类型
基本数据类型int系列、float系列、bool、string;数组和结构体struct指针、slice切片、map、管道chan、接口interface等

值类型和引用类型的使用特点:
1、值类型:变量直接存储值,内存通常在栈中分配。

2、引用类型:变量存储的是一个地址,这个地址对应的空间才真正存储数据(值),内存通常在堆上分配。当没有任何变量引用这个地址时,该地址对应的数据空间就成为一个垃圾,由GC来回收。

栈区和堆区:
通常情况下,值类型和引用类型在内存中的分配如下: