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

【Go语言入门:Go语言的方法,函数,接口】

文章目录

  • 4.Go语言的方法,函数,接口
    • 4.1. 方法
      • 4.1.1. 指针接受者
      • 4.1.2. 值接收者和指针接收者有什么区别?
      • 4.1.3. 方法
    • 4.2. 接口
      • 4.2.1. 接口定义
    • 4.3. 函数
      • 4.3.1. 函数介绍

4.Go语言的方法,函数,接口

4.1. 方法

4.1.1. 指针接受者

  1. 在编程领域,指针接收者是指在定义方法时,将指针作为参数传递给方法的一种形式。这种方式可以使方法直接操作指针所指向的原始数据,而不是对参数的副本进行操作。
  2. 在Go语言中,方法可以定义在结构体类型上,接收者是方法名称前的类型声明。指针接收者是将方法绑定到接收者类型的一个指针上,因此在方法内部对接收者的修改会影响原始值。
  3. 相对于值接收者而言,指针接收者可以避免在每次调用方法时复制接收者,从而提高程序的性能。在实际应用中,应该根据具体需求选择合适的接收者类型

4.1.2. 值接收者和指针接收者有什么区别?

在编程中,值接收者和指针接收者是函数或方法参数的两种不同传递方式。它们之间的区别如下:

  1. 值传递:值接收者通过将实际参数的值复制到函数或方法内部来进行传递。在函数或方法内部对值进行的修改不会影响到原始变量。
   package mainimport "fmt"// 定义结构体type Person struct {Name stringAge  int}// 定义方法func (p Person) PrintInfo() {p.Age = 25}func main() {person := Person{Name: "Alice", Age: 20}person.PrintInfo()fmt.Println(person.Age) }

在上述示例中,PrintInfo()方法是值接收者。当调用该方法时,person的值被复制到方法内部。即使在方法内部修改了p.Age的值,原始的person.Age并不会改变。

  1. 指针传递:指针接收者通过传递指向实际参数的指针来进行传递。在函数或方法内部对指针所指向的内容进行的修改会反映在原始变量上。
   package mainimport "fmt"// 定义结构体type Person struct {Name stringAge  int}// 定义方法func (p *Person) PrintInfo() {p.Age = 25}func main() {person := Person{Name: "Alice", Age: 20}person.PrintInfo()fmt.Println(person.Age) }

在上述示例中,PrintInfo()方法是指针接收者。当调用该方法时,&person的地址被传递到方法内部。通过修改指针所指向的内容,原始的person.Age的值也会改变。

  1. 选择使用值接收者还是指针接收者取决于你的需求。如果你只需要读取参数的值,而不需要修改它,那么使用值接收者通常更简单和安全。如果你需要修改参数的值,或者在函数或方法内部通过参数进行一些复杂的操作,那么使用指针接收者更合适。

4.1.3. 方法

在 Go 语言中,方法是与特定类型关联的函数,它是一种将数据和相关操作封装在一起的方式。方法可以定义在结构体类型上,使得对结构体的操作更加方便和自然。

  1. 方法的定义格式如下:
接收者类型.方法名(参数列表) (返回值列表)
func (p Person) PrintInfo(num int) (num){}

其中,接收者类型是方法所属的类型,通常是一个结构体或接口类型。方法名是方法的名称,可以根据需要自行定义。参数列表是方法接受的参数,可以包含零个或多个参数。返回值列表是方法返回的结果,可以包含零个或多个返回值。
2. 以下是一个示例,定义了一个名为PrintInfo的方法在Person结构体上:

package mainimport "fmt"// 定义结构体
type Person struct {Name stringAge  int
}// 定义方法
func (p Person) PrintInfo() {fmt.Println("Name:", p.Name)fmt.Println("Age:", p.Age)
}

在这个示例中,PrintInfo方法接受一个Person类型的接收器,并打印出该结构体的姓名和年龄。

  1. 要调用方法,可以使用以下语法:
接收者.方法名(参数)
  1. 例如,对于上面定义的Person结构体和PrintInfo方法,可以这样调用:
package mainimport "fmt"func main() {// 创建结构体实例p := Person{Name: "Alice", Age: 25}// 调用方法p.PrintInfo()
}

通过这种方式,我们可以将数据和相关操作封装在一起,提高代码的可读性和可维护性。
除了普通方法,Go 语言还支持指针接收器方法和接口方法。指针接收器方法可以通过指针修改接收者的字段值,而接口方法允许实现了特定接口的任意类型对象调用该方法。

4.2. 接口

4.2.1. 接口定义

  1. 接口类型 是由一组方法签名定义的集合。
  2. 接口的声明与使用:
package mainimport ("fmt""math"
)
//接口声明(形状)
type Shape interface {Area() float64Perimeter() float64
}//矩形结构体
type Rect struct {width  float64height float64
}//圆的结构体
type Circle struct {radius float64
}//计算面机的方法(矩形实现)
func (r Rect) Area() float64 {return r.width * r.height
}//计算周长(矩形实现)
func (r Rect) Perimeter() float64 {return 2 * (r.width + r.height)
}//计算面积的方法(圆实现)
func (c Circle) Area() float64 {return math.Pi * c.radius * c.radius
}//计算周长(圆实现)
func (c Circle) Perimeter() float64 {return 2 * math.Pi * c.radius
}func main() {
//声明接口类型的变量,具体值为矩形var s Shape = Rect{10, 3}fmt.Printf("type of s is %T\n", s)fmt.Printf("value of s is %v\n", s)fmt.Printf("value of s is %0.2f\n\n", s.Area())//声明接口类型的变量,具体值为圆s = Circle{10}fmt.Printf("type of s is %T\n", s)fmt.Printf("value of s is %v\n", s)fmt.Printf("value of s is %0.2f\n", s.Area())}
  1. 此外接口是golang中实现多态性的唯一好途径。
  2. go语言中还有空接口的概念,这里不做赘述。

4.3. 函数

4.3.1. 函数介绍

在 Go 语言中,函数是一种用于组织和重用代码的基本单位。函数可以执行特定的任务,并可以接受零个或多个参数,并返回零个或多个值。
以下是 Go 语言中函数的一些关键特性和语法:

  1. 函数定义:使用func关键字开始函数定义。函数名是你为函数指定的名称,参数列表列出了函数接受的参数(如果有),函数体包含了执行任务的具体代码。
func functionName(parameters) results {// 函数体
}
  1. 函数调用:通过函数名和相应的参数来调用函数。
functionName(arguments)
  1. 参数传递:函数可以通过值、引用或切片等方式传递参数。
    返回值:函数可以返回零个或多个值。
func functionName() results {// 返回值return values
}
  1. 匿名函数:可以定义匿名函数,即没有具名函数的函数。
func() {// 匿名函数体
}

函数作为参数:Go 语言允许将函数作为参数传递给其他函数。
递归函数:函数可以递归地调用自己。
Go 语言中的函数是第一类对象,可以作为变量、参数和返回值进行传递和操作。这使得函数在 Go 语言中具有高度的灵活性和可复用性。
此外,go中还有 一等函数和闭包的概念,这边先不做解释

相关文章:

【Go语言入门:Go语言的方法,函数,接口】

文章目录 4.Go语言的方法,函数,接口4.1. 方法4.1.1. 指针接受者4.1.2. 值接收者和指针接收者有什么区别?4.1.3. 方法 4.2. 接口4.2.1. 接口定义 4.3. 函数4.3.1. 函数介绍 4.Go语言的方法,函数,接口 4.1. 方法 4.1.1…...

vue-cli3/webpack打包时去掉console.log调试信息

文章目录 前言一、terser-webpack-plugin是什么?二、使用配置vue-cli项目 前言 开发环境下,console.log调试信息,有助于我们找到错误,但在生产环境,不需要console.log打印调试信息,所以打包时需要将consol…...

企业品牌推广在国外媒体投放的意义和作用何在?

海外广告投放是企业在国际市场推广的重要战略,具有多种形式,包括社交媒体广告、短视频广告、电视广告等。这些广告形式在传播信息、推动销售、塑造品牌形象等方面发挥着独特的作用。 其中软文发稿是一种注重叙事和信息传递的广告形式,对于企…...

ArcGIS批量计算shp面积并导出shp数据总面积(建模法)

在处理shp数据时, 又是我们需要知道许多个shp字段的批量计算,例如计算shp的总面积、面积平均值等,但是单个查看shp文件的属性进行汇总过于繁琐,因此可以借助建模批处理来计算。 首先准备数据:一个含有多个shp的文件夹。…...

代码质量评价及设计原则

1.评价代码质量的标准 1.1 可维护性 可维护性强的代码指的是: 在不去破坏原有的代码设计以及不引入新的BUG的前提下,能够快速的修改或者新增代码. 不易维护的代码指的是: 在添加或者修改一些功能逻辑的时候,存在极大的引入新的BUG的风险,并且需要花费的时间也很长. 代码可…...

编程笔记 html5cssjs 012 HTML分块

编程笔记 html5&css&js 012 HTML分块 一、HTML 块级元素二、HTML 内联元素三、HTML <div> 元素四、HTML <span> 元素五、HTML<article>元素六、<article>元素和<div>元素的区别与联系小结 像报纸排版一样&#xff0c;很多时候需要把平面…...

【持续更新ing】uniapp+springboot实现个人备忘录系统【前后端分离】

目录 &#xff08;1&#xff09;项目可行性分析 &#xff08;2&#xff09;需求描述 &#xff08;3&#xff09;界面原型 &#xff08;4&#xff09;数据库设计 &#xff08;5&#xff09;后端工程 接下来我们使用uniappspringboot实现一个简单的前后端分离的小项目----个…...

nginx+rsyslog+kafka+clickhouse+grafana 实现nginx 网关监控

需求 我想做一个类似腾讯云网关日志最终以仪表方式呈现&#xff0c;比如说qps、p99、p95的请求响应时间等等 流程图 数据流转就像标题 nginx ----> rsyslog ----> kafka —> clickhouse —> grafana 部署 kafka kafka 相关部署这里不做赘述&#xff0c;只要创…...

User maven 通过什么命令能查到那个包依赖了slf4j-simple-1.7.36.jar

要在 Maven 项目中查找哪个包依赖了 slf4j-simple-1.7.36.jar&#xff0c;您可以使用 Maven 的依赖树命令 mvn dependency:tree。这个命令会展示项目所有依赖的层次结构&#xff0c;包括传递依赖&#xff08;即一个依赖的依赖&#xff09;。然后&#xff0c;您可以搜索或过滤输…...

什么牌子冻干猫粮性价比高?性价比高的五款冻干猫粮牌子推荐

很多养猫的小伙伴们都磨刀霍霍准备给猫咪屯些猫冻干吧&#xff0c;特别是家里有挑食猫咪的家庭。有养猫的铲屎官们应该都知道&#xff0c;猫咪是对蛋白质的需求量很高&#xff0c;而且对植物蛋白的吸收效率比较低&#xff0c;所以蛋白质最好都是来自动物的优质蛋白。猫咪挑食就…...

扫描全能王启动鸿蒙原生应用开发,系HarmonyOS NEXT智能扫描领域首批

近期&#xff0c;“鸿蒙合作签约暨扫描全能王鸿蒙原生应用开发启动仪式”&#xff08;简称“签约仪式”&#xff09;正式举行。合合信息与华为达成鸿蒙合作&#xff0c;旗下扫描全能王将基于HarmonyOS NEXT正式启动鸿蒙原生应用开发。据悉&#xff0c;扫描全能王是鸿蒙在智能扫…...

[Angular] 笔记 8:list/detail 页面以及@Input

1. list 页面 list/detail 是重要的 UI 设计模式。 vscode terminal 运行如下命令生成 detail 组件&#xff1a; PS D:\Angular\my-app> ng generate component pokemon-base/pokemon-detail --modulepokemon-base/pokemon-base.module.ts CREATE src/app/pokemon-base/p…...

Zabbix“专家坐诊”第221期问答汇总

问题一 Q&#xff1a;使用官方docker模板Template App Docker&#xff0c;监控docker镜像&#xff0c;有一项监控项docker.data_usage有报错&#xff0c;不知道哪里问题&#xff1a;Cannot fetch data: Get “http://1.28/system/df”: context deadline exceeded (Client.Time…...

Netty—Reactor线程模型详解

文章目录 前言线程模型基本介绍线程模型分类Reactor线程模型介绍Netty线程模型&#xff1a; 传统阻塞IO的缺点Reactor线程模型单Reactor单线程模式单Reactor多线程模式主从Reactor多线程Reactor 模式小结 Netty 线程模型案例说明&#xff1a;Netty核心组件简介ChannelPipeline与…...

开源verilog模拟 iverilog verilator +gtkwave仿真及一点区别

开源的 iverilog verilator 和商业软件动不动几G几十G相比&#xff0c;体积小的几乎可以忽略不计。 两个都比较好用&#xff0c;各有优势。 iverilog兼容性好。 verilator速度快。 配上gtkwave 看波形&#xff0c;仿真工具基本就齐了。 说下基本用法 计数器 counter.v module…...

mysql中按字段1去重,按字段2降序排序

数据举例 sql语句 按字段field4降序排序&#xff0c;按字段field1去重 SELECT tt1.name2,tt1.field1,tt1.field2,tt1.field4 from ( select tt2.name2,tt2.field1,tt2.field2,tt2.field4 from t2 tt2 ORDER BY tt2.field4 DESC ) tt1 GROUP BY tt1.field1执行结果...

OCP NVME SSD规范解读-4.NVMe IO命令-2

NVMe-IO-3&#xff1a; 由于设备具有掉电保护功能&#xff08;如Power Loss Protection&#xff0c;PLP&#xff09;&#xff0c;因此在以下情况下&#xff0c;性能不应降低&#xff1a; FUA&#xff08;Force Unit Access&#xff09;&#xff1a;是计算机存储设备中的一种命…...

平凯数据库亮相 2023 信息技术应用创新论坛

11 月 25 日&#xff0c;2023 信息技术应用创新论坛在常州开幕。江苏省工业和信息化厅副厅长池宇、中国电子工业标准化技术协会理事长胡燕、常州市常务副市长李林等领导出席论坛并致辞。中国工程院院士郑纬民出席并作主题报告。来自产学研用金等各界的千余名代表参加本次论坛。…...

2024深入评测CleanMyMac X4.14.6破解版新的功能

随着时间的推移&#xff0c;我们的Mac电脑往往会变得越来越慢&#xff0c;存储空间变得越来越紧张&#xff0c;这时候一个优秀的清理工具就显得尤为重要。作为一款备受好评的Mac清理工具&#xff0c;它能够为你的Mac带来全方位的清理和优化。在本文中&#xff0c;我们将深入评测…...

WPF+Halcon 培训项目实战(8):WPF+Halcon初次开发

前言 为了更好地去学习WPFHalcon&#xff0c;我决定去报个班学一下。原因无非是想换个工作。相关的教学视频来源于下方的Up主的提供的教程。这里只做笔记分享&#xff0c;想要源码或者教学视频可以和他联系一下。 相关链接 微软系列技术教程 WPF 年度公益课程 Halcon开发 CSD…...

Vue - 实现文件导出文件保存下载

1 文件导出&#xff1a;使用XLSX插件 需求背景&#xff1a;纯前端导出&#xff0c;如 在前端页面勾选部分表格数据&#xff0c;点击"导出"按钮导出Excel文件。 实现思路&#xff1a; 1.通过XLSX插件的 XLSX.utils.book_new()方法&#xff0c;创建excel工作蒲对象wb…...

c基础学习(一)

学习网站&#xff1a; C语言的过去与未来 - C语言教程 - C语言网 (dotcpp.com)https://www.dotcpp.com/course/c-intros/ C 语言简介 - C 语言教程 - 网道 (wangdoc.com)https://wangdoc.com/clang/intro 变量&#xff1a; #include<stdio.h> /*引入头文件-- 标准…...

c语言的文件操作

当涉及到C语言中的文件操作时&#xff0c;我们需要了解一些基本的概念和函数。首先&#xff0c;让我们来看看如何打开和关闭文件&#xff0c;以及如何读取和写入文件。 要打开文件&#xff0c;我们使用fopen函数。这个函数接受两个参数&#xff1a;文件名和打开模式。打开模式…...

C语言 volatile关键字

volatile关键字介绍 volatile 是一个关键字&#xff0c;用于修饰变量&#xff0c;表示该变量是易变的&#xff0c;即可能在任何时候被意外地改变。在多线程编程中&#xff0c;当多个线程同时访问同一个变量时&#xff0c;由于线程之间的交互和优化&#xff0c;可能会导致变量的…...

IDEA快捷使用-快捷键模板

常用快捷模板 .方法的使用,例如输入 arr.null 回车 其他常规方法直接输入回车&#xff0c;不需要对象通过.来调用。 创建变量 psfi 创建公开int类型常量 public static final int prsf 创建 私有静态变量 private static final psf 创建公开静态变量 public static final创…...

在VMware安装CentOS 7:详细教程

安装准备工作 本地虚拟机&#xff1a;我这里使用的是VMware Workstation 17 Pro centos7系统ISO镜像&#xff1a;我这里使用的是CentOS-7-x86_64-DVD-2009.iso&#xff0c;具体的下载地址是在阿里云官方镜像站&#xff1a;centos-7.9.2009-isos-x86_64安装包下载_开源镜像站-阿…...

[Angular] 笔记 10:服务与依赖注入

什么是 Services & Dependency Injection? chatgpt 回答&#xff1a; 在 Angular 中&#xff0c;Services 是用来提供特定功能或执行特定任务的可重用代码块。它们可以用于处理数据、执行 HTTP 请求、管理应用程序状态等。Dependency Injection&#xff08;依赖注入&#…...

【产品经理】axure中继器的使用——表格增删改查分页实现

笔记为个人总结笔记&#xff0c;若有错误欢迎指出哟~ axure中继器的使用——表格增删改查分页实现 中继器介绍总体视图视频预览功能1.表头设计2.中继器3.添加功能实现4.删除功能实现5.修改功能实现6.查询功能实现7.批量删除 中继器介绍 在 Axure RP9 中&#xff0c;中继器&…...

面向对象进阶-继承

继承中&#xff1a;成员变量的访问特点 就近原则&#xff1a;谁离我近我就访问谁,先在局部位置找&#xff0c;找不到然后在到本类成员位置到&#xff0c;如果本类成员位置找不到就到父类成员位置找&#xff0c;逐级往上找。 package oop.Extends.a03oopextendsdemo03; public…...

[NOIP2012 普及组] 摆花

[NOIP2012 普及组] 摆花 题目描述 小明的花店新开张&#xff0c;为了吸引顾客&#xff0c;他想在花店的门口摆上一排花&#xff0c;共 m m m 盆。通过调查顾客的喜好&#xff0c;小明列出了顾客最喜欢的 n n n 种花&#xff0c;从 1 1 1 到 n n n 标号。为了在门口展出更…...

如何在自己电脑上做网站服务器/数据网站

2.1 问题 创建randpass.py脚本&#xff0c;要求如下&#xff1a; 编写一个能生成8位随机密码的程序 使用random的choice函数随机取出字符 改进程序&#xff0c;用户可以自己决定生成多少位的密码 2.2 方案 导入random模块&#xff0c;通过random静态对象调用choice()方法&…...

wordpress与hexo/百度网盘资源共享

Problem Description1967 年&#xff0c;美国著名的社会学家斯坦利米尔格兰姆提出了一个名为“小世界现象(small world phenomenon)”的著名假说&#xff0c;大意是说&#xff0c;任何2个素不相识的人中间最多只隔着6个人&#xff0c;即只用6个人就可以将他们联系在一起&#x…...

搭建网站代码/今日热点新闻一览

vue的$nextTick使用总结&#xff0c;this.$refs为undefined的解决办法&#xff0c;element Ui的树形控件setCheckedKeys方法无法使用参考文章&#xff1a; &#xff08;1&#xff09;vue的$nextTick使用总结&#xff0c;this.$refs为undefined的解决办法&#xff0c;element U…...

品牌网站建设定位/腾讯中国联通

Java反射机制Java反射(Reflection)是Java非常重要的动态特性&#xff0c;通过使用反射我们不仅可以获取到任何类的成员方法(Methods)、成员变量(Fields)、构造方法(Constructors)等信息&#xff0c;还可以动态创建Java类实例、调用任意的类方法、修改任意的类成员变量值等。Jav…...

劳务合同免费模板下载/广州seo运营

四周静悄悄的&#xff0c;只有墙上的钟表在喳喳喳地响个不停&#xff0c;似乎只有它没有疲倦的感觉。手头的山东一级OFFICE开发模块估计做了一半多了&#xff0c;今晚终于又克服了一个难题。终于可以停下来休息了。四周静悄悄的&#xff0c;我的心却显得尤为激动......记得一个…...

做外贸怎么登陆外国网站/百度关键词怎么做

ABBYY FineReader Engine用于开发ocr文字识别软件和图片识别软件&#xff0c;提供自己的OCR API, 包括光学字符识别&#xff08;OCR&#xff09;、智能字符识别&#xff08;ICR&#xff09;、光标识别&#xff08;OMR&#xff09;、光学条码识别&#xff08;OBR&#xff09;、文…...