当前位置: 首页 > news >正文

go中函数与方法的区别与go中关于面向对象理解

  1. 声明方法的区别

函数是一段可以独立调用的代码块,它可以有参数和返回值。函数的声明不依赖于任何类型,可以直接通过函数名进行调用。
函数的声明格式如下:

func functionName(parameters) returnType {// 函数体
}

示例:

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

方法
方法是附加到特定类型上的函数,这个特定类型称为方法的接收者。方法的声明需要在函数名之前指定其接收者。

方法的声明格式如下:

func (receiver ReceiverType) methodName(parameters) returnType {// 方法体
}

示例:

type MyInt intfunc (m MyInt) Add(other MyInt) MyInt {return m + other
}

在这个例子中,Add是MyInt类型的一个方法,它的接收者是MyInt类型的变量。

  1. 调用方式的区别

函数的调用很直接,只需要使用函数名并传入适当的参数即可。

result := Add(1, 2)

方法
方法的调用需要通过特定的类型实例来调用,这个实例称为方法的接收者。

var myInt MyInt = 5
result := myInt.Add(3)

在这个例子中,myInt是MyInt类型的实例,我们通过myInt来调用它的Add方法。

  1. 作用域的区别

函数
函数定义在包级别,意味着同一个包内的所有函数和方法都可以访问它(根据函数名首字母的大小写来决定访问权限)。函数不依赖于类型,所以它们的使用范围相对广泛。

方法
方法是绑定到特定类型的,这意味着方法的作用范围受到接收者类型的限制。只有该类型的实例才能调用这个方法。这使得方法可以用来实现与特定类型相关的操作和行为,实现了更好的封装和面向对象的设计。

自己的理解
在很多面向对象编程语言中,"类的成员函数"是类的一部分,用于操作或访问类的实例的数据。Go语言虽然没有类(Class)这个概念,但它通过结构体(Struct)和与之关联的方法来实现类似的面向对象编程模型。因此,从这个角度看,Go语言中的方法确实在概念上相当于其他语言中类的成员函数。

在其他一些面向对象的语言中,如Java或C++,类定义了数据(属性)和操作这些数据的函数(方法),它们被称为类的成员变量和成员函数。在Go语言中,你可以定义一个结构体来表示数据的结构,然后为这个结构体定义方法来操作这些数据,这样的方法可以看作是该结构体的“成员函数”。

示例对比
Go语言中的方法

type Person struct {Name stringAge  int
}// Person 类型的方法
func (p Person) Greet() string {return "Hello, my name is " + p.Name
}

在这个例子中,Greet函数是Person结构体的一个方法,它操作Person实例的数据。Person的每一个实例都可以调用这个方法。

其他语言中的类和成员函数
以Java为例:

public class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public String greet() {return "Hello, my name is " + this.name;}
}

在Java中,greet是Person类的一个成员函数,用于操作和访问类实例的数据。

总结
尽管Go语言的设计没有直接使用类(Class)这个概念,但通过结构体和方法提供了类似的功能。在Go中定义的方法,特别是当它们与特定的类型(如结构体)关联时,的确在逻辑上等同于其他语言中类的成员函数。
这种方式为Go语言提供了面向对象编程的能力,包括封装(通过结构体字段的导出控制)、继承(通过结构体的嵌入)和多态(通过接口)。

相关文章:

  • Bun安装与使用
  • Vant Weapp小程序 van-uploader 文件上传点击无反应,删除无反应
  • Android Q(10)黑暗模式适配的实现
  • A Little Is Enough: Circumventing Defenses For Distributed Learning
  • HTML——1.简介、基础、元素
  • 封装性练习
  • react native hooks 页面出现重绘问题,如何解决
  • 机器视觉系列之【硬件知识】-光源(三)
  • HTML网站的概念
  • 【常见面试题】Golang中,协程数最多可以开多少个?
  • 免费SSL证书和付费SSL证书的区别点
  • 马斯克旗下xAI发布Grok-1.5,相比较开源的Grok-1,各项性能大幅提升,接近GPT-4!
  • 计算两个经纬度点之间的方位角(初始方位角)
  • APS54085 高辉度调光降压恒流芯片 PWM 线性调光 车灯IC
  • Java项目:80 springboot师生健康信息管理系统
  • JS 中的深拷贝与浅拷贝
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • JavaScript类型识别
  • java正则表式的使用
  • Spring Cloud中负载均衡器概览
  • Twitter赢在开放,三年创造奇迹
  • vue-cli在webpack的配置文件探究
  • 闭包--闭包之tab栏切换(四)
  • 程序员该如何有效的找工作?
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 机器学习学习笔记一
  • 七牛云假注销小指南
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • (04)odoo视图操作
  • (第61天)多租户架构(CDB/PDB)
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)c++ std::pair 与 std::make
  • (转)mysql使用Navicat 导出和导入数据库
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .NET CORE Aws S3 使用
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .NET构架之我见
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .Net语言中的StringBuilder:入门到精通
  • @GetMapping和@RequestMapping的区别
  • @Resource和@Autowired的区别
  • [ C++ ] STL_vector -- 迭代器失效问题
  • [ai笔记9] openAI Sora技术文档引用文献汇总
  • [C#]C# OpenVINO部署yolov8图像分类模型
  • [C#基础知识系列]专题十七:深入理解动态类型
  • [Flutter]打包IPA
  • [HOW TO]怎么在iPhone程序中实现可多选可搜索按字母排序的联系人选择器
  • [IT生活推荐]大家一起来玩游戏喽,来的都进!