当前位置: 首页 > 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…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...