golang的基本类型分类
***golang中的基本类型分为值类型和引用类型***参考Go中的值类型和引用类型
函数传参的两种方式
1.值传递
2.引用传递
注:
- golang函数传参都是以复制变量的方式,不支持引用的方式
- 特殊的是:go语言闭包函数对外部变量是以引用的方式使用 参考由"go语言闭包函数对外部变量是以引用的方式使用"引发的闭包探讨
摘自go语言高级编程里的一段话:
golang传递基本类型的不同
- golang传递值类型是指复制了一份值之后传递,改变形参并不能改变原有实参的值
package main
import (
"fmt"
)
func main() {
a := 888
changeint(a)
fmt.Println(a) //888
}
func changeint(int1 int) {
int1 = 999
}
- golang传递引用类型是传递地址,改变形参会改变原有实参的值
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引用类型传递之后整体赋值,并不能改变原有实参的值
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任何类型的全局变量都能被形参改变
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传递值类型想要改变实参,需要传递值类型的指针
package main
import (
"fmt"
)
func main() {
a := 888
changeint(&a)
fmt.Println(a) //999
}
func changeint(int1 *int) {
*int1 = 999
6.golang传递值类型时通常传递指针(在对象较大时能够提升性能,减少内存使用),同时传递类型要做到统一