【Go语言】面向对象编程(一):类的定义、初始化和成员方法

news2024/11/20 13:30:14

面向对象编程(一):类的定义、初始化和成员方法

1 类的定义和初始化

Go 语言的面向对象编程没有 classextendsimplements 之类的关键字和相应的概念,而是借助结构体来实现类的声明,如下是定义一个学生类的方法:

type Student struct{
    id uint
    name string
    male bool
    score float64
}

类名为 Student,并且包含了 idnamemalescore 这四个属性。

相应的,Go 语言中也不支持构造函数、析构函数,需要我们自定义形如 Newxxx 这样的全局函数(首字母大写)作为类的初始化函数方法:

// 初始化方法(全量定义)
func NewStudent(id uint, name string, male bool, score float64) *Student {
	return &Student{id, name, male, score}
}

在如上函数中,通过传入 NewStudent 方法的字段对 Student 类进行初始化,并返回一个指向该类的指针。此外,还能够初始化指定字段,如下所示:

// 初始化方法(部分定义)
func NewStudentPart(id uint, name string, score float64) *Student {
	return &Student{id: id, name: name, score: score}
}

main 方法中调用初始化的方法,打印如下:

// 类的初始化
student := GoClass.NewStudent(1, "南歌", false, 100)
fmt.Println(student)
// male未定义,会默认为male的零值false
student2 := GoClass.NewStudentPart(1, "南歌", 100)
fmt.Println(student2)

在这里插入图片描述

2 成员方法

同上所述,Go 语言中的成员方法也需要编写函数方法来实现,主要有 值方法指针方法,两种方法的使用分别如下:

值方法

func (s Student) GetName() string  {
    return s.name
}

通过定义的 GetName() 方法,就可以在初始化 Student 类后,调用 GetName() 成员方法,使用如下:

student := GoClass.NewStudent(1, "南歌", false, 100)
fmt.Println("Name:", student.GetName())

在这里插入图片描述

注意:我们通过在函数签名中增加接收者声明的方式定义了函数所归属的类型,这个时候,函数就不再是普通的函数,而是类的成员方法了。

指针方法

上面的 值方法 只能够进行函数属性的读取,而不能做修改,可以使用如下方法简单进行测试。

func (s Student) SetName(name string) {
    fmt.Println(s)
	s.name = name
    fmt.Println(s)
}

main 函数中调用 SetName 方法,如下所示:

student3 := GoClass.NewStudent(1, "南歌", false, 100)
fmt.Println("Name:", student3.GetName())
student3.SetName("euansu")
fmt.Println("Name:", student3.GetName())

在这里插入图片描述

如上所示,在调用 SetName() 的时候,Student 并未接收函数的返回,因此即使修改了 s.name,但是类 Student 的属性也未被修改,如果要修改类 Student 的属性,就需要通过指针方法对其进行修改,如下所示:

func (s *Student) SetName(name string) {
	s.name = name
}

main 函数中按照如下方法进行调用。

student4 := GoClass.NewStudent(1, "南歌", false, 100)
fmt.Println("Name:", student4.GetName())
student4.SetName("euansu")
fmt.Println("Name:", student4.GetName()

在这里插入图片描述

3 总结
  1. Go 语言与其他编程语言相比,弱化了类的概念,而是使用结构体定义类,类内部的数据类型与普通的数据类型一样,内置的数据类型也可以通过关键字指定为包含自定义成员方法的类。
  2. Go 语言中,类的成员方法有两种,分别是值方法和指针方法,其中值方法主要是用做读取类成员属性的场景,而指针方法则是用作修改类成员属性的场景。

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

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

相关文章

2024年【危险化学品经营单位主要负责人】免费试题及危险化学品经营单位主要负责人证考试

题库来源:安全生产模拟考试一点通公众号小程序 危险化学品经营单位主要负责人免费试题根据新危险化学品经营单位主要负责人考试大纲要求,安全生产模拟考试一点通将危险化学品经营单位主要负责人模拟考试试题进行汇编,组成一套危险化学品经营…

镜舟科技与喆塔科技签署战略合作协议,共拓工业领域数据应用

近日,镜舟科技与喆塔科技正式签署战略合作协议,旨在通过双方的深度合作,共同推动工业领域企业级数据分析与智能制造的融合创新,携手为行业客户提供更加精准、高效的数据驱动解决方案。 镜舟科技 CEO 孙文现与喆塔科技 CEO 赵文政出…

12.文件

知识点一:文件的存取过程 缓冲区的目的:提高存储效率磁盘使用寿命 知识点二:磁盘文件分类 物理上所有的磁盘文件都是二进制存储,以字节为单位顺序存储 逻辑上的文件分类: 文本文件:基于字符编码的文件,如ASCII、UNICO…

04. fastLED像素参考(颜色设置详解)

fastLED像素参考 原文 Overview 概述 There’s two main pixel types in the library - the CRGB class and the CHSV class. CHSV objects have to be converted to CRGB objects before they can be written out. You can also write CHSV objects into the CRGB array an…

QT6 学生管理系统以及登录(QSQLITE数据库)

一、准备工具以及环境 本文采用的是QT Creator6.5.3版本,代码基于C语言,文中所用到的数据库是QSQLITE库。 因为做的是一个简单的学生管理系统,所以只是做到了简单的对数据库进行增删改查等操作,以及一个简单的登录界面。 二、U…

wgcloud可以监测交换机的哪些数据

WGCLOUD可以监测交换机的cpu,内存,温度,电压,磁盘,流量传输速率等数据 WGCLOUD也是基于SNMP协议来监测交换机的

进口自力式蒸汽减压阀-美国品牌

进口自力式蒸汽减压阀是一种用于蒸汽系统中,通过自身能量来调节和控制蒸汽压力的装置。以下是关于进口自力式蒸汽减压阀的详细回答: 定义与功能: 进口自力式蒸汽减压阀是一种无需外加能源,利用被调介质(蒸汽&#xff…

每日一题——Python实现PAT乙级1104 天长地久(举一反三+思想解读+逐步优化)七千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 初次尝试 点评 时间复杂度分析 空间复杂度分析 综合分析 我要更强 时间复杂度分…

VitePress+Docker+jenkins构建个人网站

VitePress官网 VitePress | 由 Vite 和 Vue 驱动的静态站点生成器 可以理解为一个前端脚手架:快速生成个人站点 最好先大概看一遍 快速开始 | VitePress 可以在线体验一下 安装条件 node -v 检查下node版本 在D盘创建一个文件夹 例如:VitePress 进入文件夹 cmd npm ini…

一键安全体检!亚信安全携手鼎捷软件推出企业安全体检活动 正式上线

亚信安全联合鼎捷软件股份有限公司(以下简称“鼎捷软件”)正式推出“一键安全体检”服务。亚信安全网络安全专家将携手鼎捷软件数据安全专家,围绕企业的数智安全状况,进行问题探索与治愈、新问题预测与预警,在全面筛查…

一文入门vim

先来波快问快答。 第一个问题,vim是什么? vim就是一文本编辑器。 第二个问题,我们为什么要使用vim? 好像在终端中可选择使用的文本编辑器也不多(其他有,但是相对而言vim用的比较广泛) 第三…

外汇天眼:跟单社区or资金盘 几招教你快速识别

今年有不少外汇跟单社区伙同黑平台收割投资人跑路事件,应天眼老粉要求,今天写一篇与跟单社区相关的内容,教大家如何辨别正规的外汇跟单社区与资金盘诈骗。 相信做过几年外汇的人,应该对跟单社区多少有所耳闻。但外汇跟单社区究竟…

使用seq2seq架构实现英译法

seq2seq介绍 模型架构: Seq2Seq(Sequence-to-Sequence)模型是一种在自然语言处理(NLP)中广泛应用的架构,其核心思想是将一个序列作为输入,并输出另一个序列。这种模型特别适用于机器翻译、聊天…

文件IOoooo

1.1 文件路径 文件路径分为两种: 1、绝对路径:以C:、D:等盘符开头的,就是我们所说的绝对路径,根据它可以直接找到文件的具体位置。 2、相对路径:需要先指定一个目录作为基准目录,从基准目录出发&#xf…

【PowerDesigner】CDM生成PDM

目录 🌊1. PowerDesigner简介 🌍1.1 常用模型文件 🌍1.2 PowerDesigner使用环境 🌊2. CDM生成PDM ​​​​​​​🌊3. 研究心得 🌊1. PowerDesigner简介 🌍1.1 常用模型文件 主要使用Pow…

肾合的秘密:长期出汗,身体在告诉你什么?

想象一下,我们的身体是一座繁茂的秘密花园,每一寸肌肤、每一个细胞都是花园里的一朵花、一片叶。汗水,则是这花园中无声的语言,它讲述着我们的健康与否,也揭示着身体内部的微妙变化。 在夏日阳光下,我们的身…

初识C++ · 反向迭代器简介

目录 前言 反向迭代器的实现 前言 继模拟实现了list和vector之后,我们对迭代器的印象也是加深了许多,但是我们实现的都是正向迭代器,还没有实现反向迭代器,那么为什么迟迟不实现呢?因为难吗?实际上还好。…

如何轻松解决自养号测评中的买家签收问题?

在当今日益繁荣的跨境电商领域,自养号测评已成为众多卖家提升销量与排名的关键策略。然而,在这条道路上,买家签收难题却像是一座难以逾越的山峰,让不少卖家感到困扰。本文将深入探讨如何巧妙攻克这一难题,为自养号测评…

Redis 持久化存储

一、简介 1、RDB redis默认的持久化存储方式,每隔一段时间将内存中的数据写入磁盘中。有手动触发和自动出发两种触发方式。 2、AOF AOF持久化将被执行的写命令记录到AOF文件的末尾,来记录数据发生的变化。Redis启动时,读取AOF文件中的命令并…

北航数据结构与程序设计第五次作业选填题复习

选填题考的很多都是基础概念,对于巩固复习一些仡佬拐角的知识点是很有用的。非北航学生也可以来看看这些题,这一节主要是树方面的习题: 一、 我们首先需要知道一个公式 这是证明: 知道了这个公式,我们把题目中的数据…