Golang指针
golang中的指针与c语言指针略有不同。
1、基本类型的指针
1 | var num int = 10 |
2、数组的指针与指针数组
数组的指针:
1 | arr := [3]int{1, 2, 3} |
指针数组:
1 | arr := [3]*int{} |
3、字典的指针
1 | maps := map[string]string{ |
4、函数的指针与指针函数
函数的指针:
1 | package main |
- 函数声明后,函数名变量本身就是指针类型,存储的是指向函数体的地址。
- 因此当对函数变量赋值给其他变量时,属于浅拷贝,只是拷贝指向函数的地址。
指针函数:指针函数与结构体方法类似,见下。
5、 结构体的指针
结构体创建对象:
1 | package main |
从结果可以看出:
- 前两种声明方式创建,变量中直接存储的是对象,对其进行拷贝为深拷贝。
- 使用new创建,变量中存储的是地址,对其拷贝为浅拷贝。
结构体的方法:
1 | package main |
由结果可知:
- 结构体的方法,如果传入的值为对象类型时(setName声明方式),不管传入的是值类型(对象)还是引用类型(指针),在方法中都会深拷贝传入的对象,修改值后传入的对象不收影响。
- 如果结构体方法传传参类型为指针类型时(setAge声明方式),不管传入的是什么类型,都属于浅拷贝,修改值影响传入的对象。
6、interface 接口
1 | package main |
结论:
- 声明接口时,接口中的函数必须在结构体中有声明
- 当结构体的方法中,有一个(最少一个)是引用类型(传递指针)的方法时,那么给接口变量赋值时,必须使用引用类型!
END🤔