golang的基本类型分类
***golang中的基本类型分为值类型和引用类型***参考Go中的值类型和引用类型
函数传参的两种方式
1.值传递
2.引用传递
注:
- golang函数传参都是以复制变量的方式,不支持引用的方式
- 特殊的是:go语言闭包函数对外部变量是以引用的方式使用 参考由"go语言闭包函数对外部变量是以引用的方式使用"引发的闭包探讨
golang传递基本类型的不同
- golang传递值类型是指复制了一份值之后传递,改变形参并不能改变原有实参的值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | package main import ( "fmt" ) func main() { a := 888 changeint(a) fmt.Println(a) //888 } func changeint(int1 int) { int1 = 999 } |
- golang传递引用类型是传递地址,改变形参会改变原有实参的值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | package main import ( "fmt" ) func main() { a := make(map[int]int) a[1] = 888 fmt.Println(a) //map[1:888] changemap(a) fmt.Println(a) //map[1:999] } func changemap(map1 map[int]int) { map1[1] = 999 } |
- golang引用类型传递之后整体赋值,并不能改变原有实参的值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | package main import ( "fmt" ) func main() { a := make(map[int]int) a[1] = 888 fmt.Println(a) //map[1:888] changemap(a) fmt.Println(a) //map[1:888] } func changemap(map1 map[int]int) { map2 := make(map[int]int) map2[1] = 999 map1 = map2 } |
注:引用进行第二次赋值的时候,实际上把这份引用指向了另外一个变量,所以之后对这个变量的操作不会影响到外部的对象。
- golang任何类型的全局变量都能被形参改变
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package main import ( "fmt" ) var map1 = make(map[int]int) func main() { map1[1] = 888 map2 := make(map[int]int) map2[1] = 999 changemap(map2) fmt.Println(map1) //map[1:999] } func changemap(map2 map[int]int) { map1 = map2 } |
- golang传递值类型想要改变实参,需要传递值类型的指针
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | package main import ( "fmt" ) func main() { a := 888 changeint(&a) fmt.Println(a) //999 } func changeint(int1 *int) { *int1 = 999 |
6.golang传递值类型时通常传递指针(在对象较大时能够提升性能,减少内存使用),同时传递类型要做到统一