Go函数和方法之间有什么区别

基础知识

在了解两者不同之前,还是简单的回顾一下基础语法知识。下面的实例,定义一个函数和方法,然后调用函数和方法。

package mainimport "fmt"// 函数和方法
func function1() {fmt.Println("我是一个名字叫做function1的函数")
}type User struct {name stringage  uint
}func (u User) function1() {fmt.Println("我是一个名字叫做function1的方法")
}func main() {// 调用函数function1()// 调用方法User{}.function1()
}

执行上述代码,go run main,会打印出如下的结果:

kert@kertdeMBP ~/c/p/w/l/g/b/demo1 (master)> go run demo5.go
我是一个名字叫做function1的函数
我是一个名字叫做function1的方法

通过上面示例代码,我们可以大致得出几点结论。

  1. 调用函数时,直接使用函数名即可(如果调用者和被调用者都在同一个包名下);调用方法,需要实例化结构体,然后通过结构体的方式去调用方法(结构体实例化有多种,示例代码使用的是字面量的方式)。
  2. 函数在定义时,直接使用 func + 函数名()即可;方法在定义时,需要使用 func (方法的接收者) + 函数名()才可以。
  3. 方法是通过"."的方式进行调用,而函数是直接使用函数名。

使用指针

接下来,在函数和方法中使用指针大佬修改值的效果。

package mainimport "fmt"// 函数和方法
func function1(a *int) {*a = 19
}type User struct {name stringage  uint
}func (u *User) function1() {u.age = 10
}func main() {a := 10function1(&a)fmt.Println("函数function1运行结果为", a)user := User{age: 12, name: "张三"}user.function1()fmt.Println("结构体user的结果是", user.age)
}

运行上诉代码,查看一下执行效果。go run main。

kert@kertdeMBP ~/c/p/w/l/g/b/demo1 (master)> go run demo5.go
函数function1运行结果为 19
结构体user的结果是 10

上面代码中,通过给函数传入一个指针,修改形参a的值;通过方法接收一个指针类型的接收者。都能够修改原值,这一点不管是函数还是方法,都没是一样的。

是否同名

接下来,通过下面的实例代码,来演示函数和方法是否支持定义相同的名称。

package mainimport "fmt"// 函数和方法
func function1(a *int) {*a = 19
}func function1() {fmt.Println("随便打印一点东西")
}type User struct {name stringage  uint
}func (u *User) function1() {u.age = 10
}type Animal struct {name stringage  uint
}func (u *Animal) function1() {u.age = 10
}

仍然是运行上诉代码,查看一下执行结果是怎么样的。go run main。

kert@kertdeMBP ~/c/p/w/l/g/b/demo1 (master)> go run demo5.go
# command-line-arguments
./demo5.go:10:6: function1 redeclared in this block./demo5.go:6:6: other declaration of function1

可以通过运行结果得出如何结论。

  1. 函数的名称是不能重复的,不管是传递的参数还是返回的参数是否相同,函数名称都不允许重复定义。

  2. 方法的名称是可以重复的,前提是方法的接收者不能相同。

总结

含义不同
函数function是⼀段具有独⽴功能的代码,可以被反复多次调⽤,从⽽实现代码复⽤。⽽⽅法method是⼀个类的⾏为功能,只有该类的对象才能调⽤。

⽅法有接受者,⽽函数⽆接受者

  1. Go语⾔的⽅法method是⼀种作⽤于特定类型变量的函数,这种特定类型变量叫做Receiver(接受者、接收者、接收器);
  2. 接受者的概念类似于传统⾯向对象语⾔中的this或self关键字;
  3. Go语⾔的接受者强调了⽅法具有作⽤对象,⽽函数没有作⽤对象;
  4. ⼀个⽅法就是⼀个包含了接受者的函数;
  5. Go语⾔中, 接受者的类型可以是任何类型,不仅仅是结构体, 也可以是struct类型外的其他任何类型。

函数不可以重名,⽽⽅法可以重名

  1. 只要接受者不同,则⽅法名可以⼀样。

调用方式不一样

  1. 方法是struct对象通过.点号+名称来调用,而函数是直接使用名称来调用。

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

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

相关文章

要致富 先撸树——判断循环语句(六)

引子 什么?万年丕更的作者更新了? 没错!而且我们不当标题党,我决定把《我的世界》串进文章里。 什么?你不玩《我的世界》? 木有关系 本专栏文章主要在讲c语言的语法点和知识,保证让不玩《我…

Azure Machine Learning - 在 Azure 门户中创建AI搜索技能组

你将了解 Azure AI 搜索中的技能组如何通过添加光学字符识别 (OCR)、图像分析、语言检测、文本翻译和实体识别,在搜索索引中创建可搜索文本的内容。 关注TechLead,分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff…

Python程序员入门指南:就业前景

文章目录 标题Python程序员入门指南:就业前景Python 就业数据Python的就业前景SWOT分析法Python 就业分析 标题 Python程序员入门指南:就业前景 Python是一种流行的编程语言,它具有简洁、易读和灵活的特点。Python可以用于多种领域&#xff…

ganache部署智能合约报错VM Exception while processing transaction: invalid opcode

这是因为编译的字节码不正确,ganache和remix编译时需要选择相同的evm version 如下图所示: remix: ganache: 确保两者都选择london或者其他evm,只要确保EVM一致就可以正确编译并部署, 不会再出现VM Exception while processing…

分享一个国内可用的免费GPT4-AI提问AI绘画网站工具

一、前言 ChatGPT GPT4.0,Midjourney绘画,相信对大家应该不感到陌生吧?简单来说,GPT-4技术比之前的GPT-3.5相对来说更加智能,会根据用户的要求生成多种内容甚至也可以和用户进行创作交流。 然而,GPT-4对普…

LangChain 18 LangSmith监控评估Agent并创建对应的数据库

LangChain系列文章 LangChain 实现给动物取名字,LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索I…

Nacos源码解读03——管理元数据

监听元数据事件 NamingMetadataManager Overridepublic void onEvent(Event event) {//实例元数据if (event instanceof MetadataEvent.InstanceMetadataEvent) {handleInstanceMetadataEvent((MetadataEvent.InstanceMetadataEvent) event);//服务元数据 } else if (event …

SSM框架(五):Maven进阶

文章目录 一、分模块开发1.1 分模块开发的意义1.2 步骤 二、依赖管理2.1 依赖传递2.2 可选依赖和排除依赖 三、继承与聚合3.1 聚合3.2 继承3.3 聚合和继承区别 四、属性4.1 pom文件的依赖使用属性4.2 资源文件使用属性 五、多环境开发六、跳过测试七、私服7.1 下载与使用7.2 私…

文件操作-IO

文件操作-IO 1.认识文件1.什么是文件2.文件路径 2.java中操作文件2.1 File类的用法 3.InputStream和OutputStream的用法 1.认识文件 1.什么是文件 文件是计算机系统中用来存储数据的基本单位。它是一种用于持久性存储数据的命名、有序的数据集合.计算机系统通过文件系统来组织…

gitlab高级功能之容器镜像仓库

今天给大家介绍一个gitlab的高级功能 - Container Registry,该功能可以实现docker镜像的仓库功能,将gitlab上的代码仓的代码通过docker构建后并推入到容器仓库中,好处就是无需再额外部署一套docker仓库。 文章目录 1. 参考文档2. Container R…

【动手学深度学习】(九)Kaggle房价预测

文章目录 一、代码1.下载和缓存数据集 【相关总结】1.os.makedirs()2.os.path.join()3.os.path.exits()4.os.path.dirname() 一、代码 题目链接 1.下载和缓存数据集 建立字典DATA_HUB,将数据集名称的字符串映射到数据集相关的二元组上,这个二元组包含…

Linux 进程(三)

Linux进程状态的查看: 这是Linux内核源代码对于进程状态的定义: R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。 S睡眠状态(sleeping): 意味着进程在…

openGauss学习笔记-138 openGauss 数据库运维-例行维护-检查时间一致性

文章目录 openGauss学习笔记-138 openGauss 数据库运维-例行维护-检查时间一致性138.1 操作步骤 openGauss学习笔记-138 openGauss 数据库运维-例行维护-检查时间一致性 数据库事务一致性通过逻辑时钟保证,与操作系统时间无关,但是系统时间不一致会导致…

[传智杯 #3 决赛] 商店

disangan333 想给 disangan233 买一个礼物,于是他和你一起逛商店。 超详细,超详细,超详细,超详细 题目描述 有 n 名同学去逛商店,店里有 m 个物品,第 i 人有 wi​ 块钱,第 i 个物品价格 ci​…

18487.1 - 2015 电动汽车充电系统标准 第1部分 关键点梳理

一、部分知识介绍 1、连接方式 使用电缆和连接器将电动汽车接入电网(电源)的方法。 1.1、连接方式A 1.2、连接方式B 1.3、连接方式C 2、电动汽车控电设备 2.1、按照输出电压分类 1)交流 单相 220V,三相 380V. 2&#xff09…

【超全】React学习笔记 下:路由与Redux状态管理

React学习笔记 React系列笔记学习 上篇笔记地址:【超全】React学习笔记 上:基础使用与脚手架 中篇笔记地址:【超全】React学习笔记 中:进阶语法与原理机制 React路由概念与理解使用 1. 引入 React路由是构建单页面应用(SPA, Sin…

Kotlin学习之03

nonLocalReturn返回调用的方法,下面直接返回main方法 inline fun nonLocalReturn(block:() -> Unit) { block() } fun main() { nonLocalReturn { return } } 禁止non-local-return,使用crossinline关键字 public inline fun IntArray.forEach(…

布局问题1:addSpacing()和setSpacing()函数的区别?

addSpacing()和setSpacing()函数的区别? 1)addSpacing() :插入间距10,用于增加两个控件之间距离; 2)setSpacing():设置各部件的相邻距离,用于设置属于一个布局中的所有控件之间的间距。 这里举…

CSS 选择器优先级,!important 也会被覆盖?

目录 1,重要性2,专用性3,源代码顺序 CSS 属性值的计算过程中。其中第2步层叠冲突只是简单说明了下,这篇文章来详细介绍。 层叠冲突更广泛的被称为 CSS选择器优先级计算。 为什么叫层叠冲突,可以理解为 CSS 是 Cascadi…

基于 Python+flask 构建态势感知系统(附完整源码)

一、开发 一个基于linux的态势感知系统,基于python和flask框架开发,项目文件目录如下: admin -核心算法 charts -图表生成 model -类 app.py -主文件 config.py -配置文件 install.py -安装文件 二、安装 1、配置 数据库密码默认设…