编程笔记 Golang基础 029 方法

编程笔记 Golang基础 029 方法

  • 一、方法的定义
  • 二、方法的使用
  • 三、方法接收者的不同类型
  • 四、应用示例
  • 五、方法的意义

在Go语言中,方法(Method)是与某种类型相关联的函数,它允许你为自定义类型添加行为。方法通过在其签名中包含一个特殊的参数——接收者(Receiver),来实现面向对象编程中的类成员函数的概念。

一、方法的定义

方法定义的基本语法格式如下:

// 接收者可以是值类型或指针类型
func (receiver ReceiverType) methodName(parameters) (returnTypes) {// 方法体
}

例如:

type Person struct {name stringage  int
}// 值接收者
func (p Person) SayHello() {fmt.Printf("Hello, my name is %s\n", p.name)
}// 指针接收者
func (p *Person) SetName(newName string) {p.name = newName
}

二、方法的使用

调用方法就像调用普通函数一样,只不过需要通过类型的实例或者实例的指针来调用相应的方法。

// 创建一个Person实例
p := Person{"Alice", 25}// 调用值接收者方法
p.SayHello()// 创建一个指向Person实例的指针
pp := &p// 调用指针接收者方法
pp.SetName("Bob")// 再次调用SayHello方法,此时名字已更改
pp.SayHello()

三、方法接收者的不同类型

  • 值接收者:方法接收者可以是一个值类型,如 func (p Person) ...。这意味着方法操作的是接收者的副本。如果对结构体进行了修改,这些修改不会影响原始变量。
  • 指针接收者:方法接收者也可以是指针类型,如 func (p *Person) ...。这时方法操作的是接收者所指向的内存地址上的数据,因此可以直接修改原始变量。

选择使用值接收者还是指针接收者取决于具体需求:

  1. 如果方法不需要修改接收者的基础数据,那么值接收者通常就足够了。
  2. 当方法需要修改接收者的状态时(比如更新结构体字段的值),则应使用指针接收者,因为对指针的操作会直接影响到实际的数据结构。
  3. 对于大型结构体,使用指针接收者可以避免复制整个结构体的开销。对于小的、不可变的结构体或基础类型,使用值接收者即可。

四、应用示例

以下是一个综合示例,定义了一个BankAccount结构体,并为其添加了两个方法:一个用于存款(deposit),一个用于取款(withdraw)。其中,存款方法使用值接收者,取款方法使用指针接收者,因为我们需要修改账户余额。

package mainimport ("fmt"
)// 定义BankAccount结构体
type BankAccount struct {balance float64
}// 值接收者方法:Deposit,用于存款
func (account BankAccount) Deposit(amount float64) {account.balance += amountfmt.Printf("Deposited %.2f, new balance is %.2f\n", amount, account.balance)
}// 指针接收者方法:Withdraw,用于取款
func (account *BankAccount) Withdraw(amount float64) error {if amount > account.balance {return fmt.Errorf("Insufficient balance. Required: %.2f, Available: %.2f", amount, account.balance)}account.balance -= amountfmt.Printf("Withdrew %.2f, new balance is %.2f\n", amount, account.balance)return nil
}func main() {// 创建一个新的银行账户account := BankAccount{balance: 1000.00}// 使用值接收者调用Deposit方法account.Deposit(500.00)// 创建指向account的指针accountPtr := &account// 使用指针接收者调用Withdraw方法err := accountPtr.Withdraw(200.00)if err != nil {fmt.Println(err)} else {// 再次尝试取款,这次会因为余额不足而失败err = accountPtr.Withdraw(1500.00)if err != nil {fmt.Println(err)}}
}

运行此代码将看到以下输出:

Deposited 500.00, new balance is 1500.00
Withdrew 200.00, new balance is 1300.00
Insufficient balance. Required: 1500.00, Available: 1300.00

五、方法的意义

在Go语言中,方法具有极其重要的地位,因为它们是面向对象编程(OOP)特性的重要组成部分。尽管Go语言并不完全遵循传统的类继承模型,但通过结构体和接口的组合以及方法的使用,Go实现了基于类型和行为的封装、抽象和多态等核心OOP概念。

以下是方法在Go语言中的重要性:

  1. 封装:方法允许将相关操作绑定到特定类型上,增强了代码的封装性。通过定义私有字段和公共方法,可以隐藏内部实现细节,只暴露必要的接口给外部世界。

  2. 代码组织:通过为结构体定义方法,开发者可以逻辑地组织代码,将与特定类型数据相关的操作集中在一起,使得代码更易于理解和维护。

  3. 增强类型功能:方法扩展了基本类型的语义和功能,比如可以为自定义的Point结构体定义计算距离、旋转或平移的方法,从而增加点的几何运算能力。

  4. 多态性支持:Go通过接口实现了一种形式的多态。一个类型如果实现了某个接口的所有方法,那么它就隐式地满足该接口,可以在需要该接口的地方进行类型替换。

  5. 减少重复代码:通过定义接收者为不同结构体类型的方法,可以避免大量重复的函数代码,这些函数可能只是作用于不同类型的数据而已。

  6. 简化调用语法:方法的调用方式(如 variable.MethodName(args))比普通函数调用更加直观,尤其是当方法操作的是当前上下文的对象时,使代码更清晰易读。

  7. 内存效率:对于值类型的接收者,方法调用可能会创建副本;而对于指针接收者,则直接操作原对象,避免复制大对象带来的性能开销,同时允许改变原对象的状态。

综上所述,方法是Go语言设计中的关键元素之一,它们有助于构建模块化、可复用且易于维护的软件系统。

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

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

相关文章

textbox文本框跨线程写入,扩展textobx控件

在Windows Forms中,由于UI控件不是线程安全的,直接跨线程访问和修改UI控件通常会导致不可预测的行为或异常。TextBox 控件同样不能直接从非创建它的线程进行写入。为了安全地在不同线程间更新 TextBox 控件的内容,你可以使用控件的 Invoke 方…

【Flink精讲】Flink 内存管理

面临的问题 目前, 大数据计算引擎主要用 Java 或是基于 JVM 的编程语言实现的,例如 Apache Hadoop、 Apache Spark、 Apache Drill、 Apache Flink 等。 Java 语言的好处在于程序员不需要太关注底层内存资源的管理,但同样会面临一个问题&…

从零开始学习Netty - 学习笔记 -Netty入门-EventLoop

5.Neety入门 什么是Netty Netty是一个基于Java NIO的异步事件驱动的网络应用框架。它被广泛用于开发高性能、高可靠性的网络通信程序,特别是服务器端和客户端程序。Netty提供了简洁而强大的API,使得开发者能够轻松地构建各种网络应用,包括实…

LiveQing视频点播流媒体RTMP推流服务功能-支持配置开启 HTTPS 服务什么时候需要开启HTTPS服务

LiveQing视频点播流媒体RTMP推流服务功能支持配置开启 HTTPS 服务什么时候需要开启HTTPS服务 1、配置开启HTTPS1.1、准备https证书1.1.1、选择Nginx类型证书下载 1.2、配置 开启 HTTPS1.2.1 web页面配置1.2.2 配置文件配置 2、验证HTTPS服务3、为什么要开启HTTPS3.1、安全性要求…

制冷系统调试的要点

包含:蒸发温度、冷凝温度、检验吸气温度、排气温度及过冷温度、校验自动保护元件的调定值等。这些温度参数直接影响了制冷机的性能(如制冷量及功率消耗等),因而必须对其进行调整,使之稳定在合理的范围之内。 1、根据冷间温度来确定蒸发温度 对…

Mysql运维篇(四) MHA

大佬博文 https://www.cnblogs.com/gomysql/p/3675429.html MySQL 高可用(MHA) - 知乎 一、MHA简介: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司y…

freeswitch 权威指南 --- 高级篇

官网文档:https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/ 关于 freeswitch 的公开教程:https://zhuanlan.zhihu.com/p/451981734 内容来自 《FreeSWITCH 权威指南》:目录:https://juejin.cn/post/702058079…

人力资源管理信息化系统如何支持企业开展管理诊断

人力资源顾问有限公司致力于帮助企业开展人力资源管理方面的各项提升改进工作,在长期的咨询工作中,最常听到企业提到的问题莫过于管理诊断方面的问题,事实上,很多企业在日常工作中,都意识到企业内部存在管理方面的问题…

vue3+js 实现记住密码功能

常见的几种实现方式 1 基于spring security 的remember me 功能 ​​​​​​​ localStorage 除非主动清除localStorage 里的信息 ,不然永远存在,关闭浏览器之后下次启动仍然存在 存放数据大小一般为5M 不与服务器进行交互通信 cookies 可以…

第11章 互连网络体系结构

之前,我们尚未讨论如何可靠、快速地将消息从一个节点发送到另一个节点。本章目的是讨论多个处理器互连的结构。互连网络最重要的两个性能指标是延迟和带宽。 基于共享存储多处理器的几个通信特性,与诸如局域网或因特网等其他网络系统相比,共…

react hook使用UEditor引入秀米图文排版

里面坑比较多,细节也比较多 以下使用的是react 18 ice3.0,使用其他react脚手架的配置基本相同,例如umi4 1.下载UEditor 进入UEditor仓库,找到版本v1.4.3.3,点击进去 接着下载ueditor1_4_3_3-utf8-jsp.zip版本 下载好…

【人工智能】减轻 LLM 幻觉的 7 大策略

一、说明 大型语言模型 (LLM) 的引入为人工智能 (AI) 和机器学习 (ML) 领域带来了重大的范式转变。凭借其显着的进步,LLM 现在可以生成不同主题的内容,解决复杂的查询,并…

CentOS 7 定时任务 + Shell 脚本自动备份 MySQL 数据库(一次 Halo 建站数据库丢失的教训)

文章目录 前置条件创建备份脚本设置 Cron 任务测试备份脚本备份安全和维护一键恢复自动清除备份文件常见问题总结 TIP: 原文链接阅读体验更佳:CentOS 7 自动备份 MySQL 数据库 最近抽空简单搭了一个博客,目前内容较少,后续陆续发…

信息系统服务:演绎数字时代的征程

信息系统服务作为数字化时代的基石,已经在人类社会的各个领域发挥着重要作用。本文将从信息系统服务的起源、发展和演化过程,通过生动的例子和准确客观的历史事实,探讨信息系统服务对人类社会的影响与变革。 1. 起源:信息处理的初…

Supermaven惊艳亮相:300,000个Tokens的超大上下文窗口,能否超越Copilot成为代码补全新王者?

当我看到GitHub宣布Copilot的年经常性收入突破1亿美元时,我意识到代码补全技术已经迈入了新的时代。 大型模型的崛起使得这些工具变得更加智能和实用,吸引了越来越多的开发者加入AI编码的行列。 在这个背景下,Supermaven发布了。这是第一个…

软件设计模式:适配器模式详解

引言 在软件设计中,经常会面临需要整合不同接口或系统的情况。适配器模式(Adapter Pattern)是一种解决这类问题的常见设计模式。本文将深入介绍适配器模式的概念、使用场景,并通过Java代码示例进行说明。 适配器模式概述 适配器…

TikTok直播网络不稳定是什么原因

在当今社交媒体平台中,TikTok以其独特的视频内容和社交互动功能而备受欢迎。然而,尽管TikTok为用户提供了直播功能,但一些用户可能会遇到TikTok直播网络不稳定的问题。那么,TikTok直播网络不稳定的原因是什么呢?以下是…

(每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第11章 项目成本管理(五)

博主2023年11月通过了信息系统项目管理的考试,考试过程中发现考试的内容全部是教材中的内容,非常符合我学习的思路,因此博主想通过该平台把自己学习过程中的经验和教材博主认为重要的知识点分享给大家,希望更多的人能够通过考试&a…

关于Arrays类中asList(T... a)泛型参数辨析

前提 我们需要知道两点 (1)T指的是泛型类型,它只能是引用类型,何为引用类型?在java中除了基本数据类型(如byte、short、int、long、float、double、boolean、char)之外的所有类型都是引用类型…

车载电子测试学习内容

搜集了一些车载测试的学习内容,大家可以参考。