值类型和引用类型
- 值类型变量内存中存储的是值本身,值类型内存通常在栈中分配。
- 引用类型变量内存中存储的是值的内存地址,引用类型内存通常在堆中分配。
哪些是值类型哪些是引用类型
值类型:数值型系列,字符串,bool,数值,结构体
引用类型:slice,map,接口,channel,指针
那么问题来了:函数属于什么类型?
函数类型
先下结论:函数是引用类型。
论证:
package main
import "fmt"
type testFun func(int32) int32
func A(a int32) int32 {
return a + int32(1)
}
func editFun(afun testFun) {
fmt.Printf("afun传进来的-value:%v,afun传进来的-地址:%v\n", afun, &afun)
bfun := func(a int32) int32 {
return a + 3
}
fmt.Printf("bfun-value:%v\n", bfun)
afun = bfun
fmt.Printf("afun传进来修改后的-value:%v,afun传进来修改后的-地址:%v\n", afun, &afun)
return
}
func main() {
var afun = A
fmt.Printf("afun原来的-value:%v,afun原来的-地址:%v\n", afun, &afun)
editFun(afun)
fmt.Printf("afun修改后后外层的-value:%v,afun修改后后外层的-地址:%v\n", afun, &afun)
res := afun(3)
fmt.Println(res)
}
运行结果:
afun原来的-value:0x108af40,afun原来的-地址:0xc00000e028
afun传进来的-value:0x108af40,afun传进来的-地址:0xc00000e038
bfun-value:0x108af60
afun传进来修改后的-value:0x108af60,afun传进来修改后的-地址:0xc00000e038
afun修改后后外层的-value:0x108af40,afun修改后后外层的-地址:0xc00000e028
4
说明:
- afun内存中存放的是函数指令的地址
- 函数内部修改了afun的值,改为bfun函数指令的地址
- 在editFun函数外部afun存放的仍然是之前函数指令的地址,所以结果是加1,而不是加3