谈谈Go语言中函数的本质

news2024/11/29 2:31:05

在很多编程语言中,都会有函数一说,今天我们来聊聊Go语言中的函数。

废话不多说,咱们直接上代码~

代码

package main

import "fmt"

func main() {
	fmt.Printf("%T\n", function1)
	fmt.Printf("%T\n", function2)
	fmt.Printf("%T\n", function3)
}

func function1() {
}

func function2(a, b int) {
}

func function3(a, b int) int {
	return a + b
}

结果

func()
func(int, int)
func(int, int) int

通过结果我们可以看出,在Go语言中,函数也是一种数据类型。既然是数据类型,我们很容易联想到是否可以将函数赋值给一个变量,我们接着测试。

代码

import "fmt"

func main() {
	fun("fun")
	r := fun
	r("r")
}

func fun(msg string) {
	fmt.Println("这里被", msg, "调用")
}

结果

这里被 fun 调用
这里被 r 调用

通过反馈回来的结果我们可以得知,函数名 fun 不加括号时,fun 函数就变成了一个变量;如果 fun 加括号变为 fun( ) 时,就变成了函数调用。

Ⅰ、函数在 Go 语言中是复合类型,可以看作是一种特殊的变量

Ⅱ、函数名( ) : 调用函数,返回结果

Ⅲ、函数名 : 指向函数体的内存地址,一种特殊类型的指针变量

我们现在已经了解到函数在 Go 语言中可以被当作是一种特殊的变量,下面我们来分析一下函数与被函数赋值的变量在内存中是如何存储的。

代码

package main

import "fmt"

func main() {

	v := function // 引用传递的方式

	fmt.Printf("function: %p\n", function)
	fmt.Printf("v: %p\n", v)
	fmt.Printf("&v: %p\n", &v)
}

func function() {
}

结果

function: 0x76fb00
v: 0x76fb00
&v: 0xc0000ca018

通过结果,我们可以看出,变量 v 的数值是函数 function 的地址,我们画图理解。

解释:变量 v 本身的地址是 0xc0000ca018,其存储的 value 值是 0x76fb00,也就是函数 function 所在的地址,所以当 function 赋值给变量 v 后,我们就可以用变量 v 加括号来调用函数 function。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/49308.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跨越速运如何构建实时统一的运单分析

作者:张杰,跨越速运大数据架构师(本文为作者在 StarRocks Summit Asia 2022 上的分享) 作为大型现代化综合速运企业,跨越速运拥有 3000 多家服务网点 ,日均处理 30 多万票运单。海量运单数据涌来&#xff…

博科交换机使用

博科交换机使用 ip查询 博科交换机的默认IP地址是10.77.77.77,用户名admin,密码:password。 ipaddrshowip修改 ipaddrset端口查询 交换机的端口表示为(A,B)或者(A,B;C,D)。 A,C表示交换机的…

使用JLINK给GD32下载程序

使用JLINK给GD32下载程序关于GD32单片机需要的工具和软件包①Jlink仿真器一个②相关软件包下载准备①选择好芯片②在DEBUG中选择JLINK下载现象总结关于GD32单片机 GD32是兆易创新基于Arm Cortex-M内核和RISC-V内核,推出的32位通用微控制器,对比了下两者…

[附源码]Python计算机毕业设计SSM流浪宠物申领信息平台(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Java中进制基础知识与算法题

本篇文章旨在给大家普及下计算机内部数据的机器级表示方式,即:二进制、八进制、十进制、十六进制… 对于进制,我们从小最先接触的是十进制,这个也是我们日常生活中应用最多的数值统计方式。然而,现实中我们感觉到的媒体…

python的opencv操作记录(十)——图像融合

文章目录前言opencv中的一个方法泊松融合图像梯度图像散度融合图像散度通过散度场进行图像重建泊松融合的一般逻辑前言 最近碰到一个项目上的难题,是要从电动显微镜对焦的多张图像进行融合。因为,显微镜物镜的景深范围较小,可能在同一视野中…

地理空间数据共享资源大汇总

1.全国12.5米分辨率ALOS高程数据 全国12.5米分辨率DEM数据,该数据由锐多宝的地理空间提供并进行分省裁剪与镶嵌,由测绘营地进行影像坐标系转换。 ALOS-12.5m高程数据参数: 覆盖范围:全国(仅有小部分区域存在数据空白…

本机使用python操作hdfs搭建及常见问题

一.虚拟机安装CentOS7并配置共享文件夹 二.CentOS 7 上hadoop伪分布式搭建全流程完整教程 三.本机使用python操作hdfs搭建及常见问题 四.mapreduce搭建 五.mapper-reducer编程搭建 本机使用python操作hdfs搭建及常见问题一、环境搭建1.打开虚拟机系统,打开hadoop2.修…

【JavaScript 逆向】极验四代滑块验证码逆向分析

前言 相较于三代滑块,四代的逻辑流程更简短,底图没混淆,某些点校验不严格 声明 本文章中所有内容仅供学习交流,相关链接做了脱敏处理,若有侵权,请联系我立即删除! 案例目标 滑动验证码&…

[NAS] QNAP/威联通 常用设置和操作

🍁简介 QNap 产品是一种可扩展的数据存储解决方案。它们包括具有 1 到 30 个驱动器托架的设备,并提供 HDMI、Thunderbolt 2 和 USB 3.1 等连接选项,以及 802.11ac/a/n Wi-Fi 和高达每秒 40 Gb 的以太网。内置软件提供基本服务,例如…

WeetCode2滑动窗口系列

一丶[无重复字符的最长子串](3. 无重复字符的最长子串 - 力扣(Leetcode))# 思路:# 维护一个窗口,窗口中不存在重复的字符,窗口右边界从第一个字符移动到最后,使用一个变量记录窗口大小的最大值 那么问题就变成了&…

浅谈h264和h265的区别

相比h264,压缩同样的视频获得同样的质量的情况下,h265可以做到压缩后的大小为前者的一半,但压缩时间复杂度增加。h264编码单元为宏块(MB),最大划分为16x16,而h265编码单元为编码树单元(CTU),最大划分为64x6…

C++ 不知算法系列之深入动态规划算法思想

1. 前言 前面写过一篇博文,介绍了什么是动态规划算法。动态规划算法的最大特点,原始问题可以通过分解成规模更小的子问题来解决,子问题之间互成依赖关系,先计算出来的子问题的结果会影响到后续子问题的结果。 有点类似于武侠片中…

Python——变量以及基础数据类型练习题

要求:注意变量名的命名规范问题!!!不能再出现没有意义的变量名!!!一行一注释,用下划线命名法。 请使用相对应的数据类型,不能全部使用字符串!!&a…

HotSpot VM垃圾收集器——Serial Parallel CMS G1垃圾收集器的JVM参数、使用说明、GC分析

目录HotspotVM的垃圾收集器简介1. Serial Collector2. Parallel Collector(throughput collector)3. Concurrent Mark Sweep Collector(CMS)4. Garbage-First Garbage Collector(G1)5. Z Garbage Collector…

STM32实战总结:HAL之GUI

在TFT上简单的显示字符、数字、汉字、图形、图片等,都是一些简单的显示。如果想要进行较为复杂的显示,就推荐使用GUI。 市面上常见的嵌入式GUI有LVGL,emWin(ucGUI),TouchGFX,Embedded GUI、QT f…

[附源码]计算机毕业设计springboot基于vuejs的爱宠用品销售app

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

ES系列二之常见问题解决

一 更新ES信息报错 报错信息如下:Use ElasticsearchException.getFailedDocuments() for detailed messages [{yjZ8D0oBElasticsearchException[Elasticsearch exception [typecluster_block_exception, reasonindex [au_report] blocked by: [FORBIDDEN/12/index …

c++ vector的模拟实现以及迭代器失效问题

目录 1.vector的模拟实现 2.迭代器失效问题 3.总结 1.vector的模拟实现 这里&#xff0c;我们使用三个指针来控制vector。 用_start指向头&#xff0c;_finish指向最后一个元素的尾巴&#xff0c;_end指向最大容量。 #include<iostream> #include<cassert>usin…

Spring Cloud Netfix Hystrix(断路器)

一、灾难性雪崩 造成灾难性雪崩效应的原因&#xff0c;可以简单归结为下述三种&#xff1a; 服务提供者&#xff08;Application Service&#xff09;不可用。如&#xff1a;硬件故障、程序BUG、缓存击穿、并发请求量过大等。 重试加大流量。如&#xff1a;用户重试、代码重试…