Go语言数据类型-函数

值类型和引用类型

  • 值类型变量内存中存储的是值本身,值类型内存通常在栈中分配。
  • 引用类型变量内存中存储的是值的内存地址,引用类型内存通常在堆中分配。

哪些是值类型哪些是引用类型

值类型:数值型系列,字符串,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

说明:

  1. afun内存中存放的是函数指令的地址
  2. 函数内部修改了afun的值,改为bfun函数指令的地址
  3. 在editFun函数外部afun存放的仍然是之前函数指令的地址,所以结果是加1,而不是加3
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值