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

golang学习笔记20-面向对象(二):方法与结构体【重要】

本节内容是面向对象的核心与基础,很重要。
注意:由于导包语句已经在19讲(笔记19:面向对象的引入)展示过了,所以这里就不展示了。

一、方法的定义与细节

方法是与特定类型(通常是结构体)关联的函数。方法可以操作该类型的实例,并且可以使用其字段。定义方法时,需要指定一个接收者(receiver),这使得方法能够访问该接收者的属性。语法如下:

func (receiver TypeName) MethodName(parameters) returnList {// 方法体
}

receiver是接收者的名称,类型是你想要关联的自定义类型(通常是结构体)。
MethodName是方法的名称。
parameters是方法接受的参数。
returnList是返回值类型列表。
首先,在utils中定义一个结构体和一个方法:

type Circle struct {Radius float64
}// 定义一个方法,计算圆的面积
// 1. 方法中参数名字随便起
// 2. 方法 Area 和结构体 Circle绑定,必须在同包中定义!
func (c Circle) Area() float64 {return 3.14 * c.Radius * c.Radius
}

然后在main中调用:

func main() {// 创建一个 Circle 实例circle := utils.Circle{Radius: 5}// 调用方法area := circle.Area()// 输出结果fmt.Printf("Area: %.2f\n", area)
}

一些细节
1.如果其他类型的变量调用area一定会报错
2.结构体对象传入方法area中,属于值传递,和参数传递一致。
3.receiver的类型是你想要关联的自定义类型
4.如果某个自定义类型实现了返回string,名字为String()的方法(如果是同包内调用,s可以小写),那么fmt包的Printf或Println函数打印该类型时,会自动调用String()
对于前两点,首先,在utils中定义另一个方法来演示值传递:

// 定义一个方法,演示值传递
func (c Circle) SetRadius(newRadius float64) {c.Radius = newRadiusfmt.Printf("Inside Radius: %.2f\n", c.Radius)
}

然后在main文件中调用:

type test struct {a int
}func main() {// 创建一个 Circle 实例circle := utils.Circle{Radius: 5}// 调用方法area := circle.Area()fmt.Printf("Area: %.2f\n", area)// 1. 如果其他类型变量调用 area 一定会报错// 下面的代码将导致编译错误//t := test{}// t.area() // 这行会报错,因为 radius 不是 Circle 类型// 2. 结构体对象传入方法 Area 中,属于值传递circle2 := utils.Circle{Radius: 10}fmt.Printf("Old Radius: %.2f\n", circle2.Radius)// 调用 SetRadius 方法尝试修改半径circle2.SetRadius(15)fmt.Printf("New Radius: %.2f\n", circle2.Radius) // 仍然是 10
}

OK,如果我就想在SetRadius内改变radius呢?那肯定是用指针了,但方法比数组指针简单:将SetRadius中的Circle前加上*即可,因为编译器会自动处理结构体指针,所以在main中的代码无需改动!
对于第三点,receiver的类型是你想要关联的自定义类型,这也就是说,基本类型不能作为方法中的接收类型!读者可自行尝试,这里不做赘述。
对于第四点,首先,在utils内定义String():

func (p Person) String() string {str := fmt.Sprintf("name=%s,age=%v,sex=%s", p.Name, p.Age, p.Sex)return str
}

然后在main中调用:

func main() {p := utils.Person{Name: "李华", Age: 30, Sex: "女"}fmt.Printf("%v\n", p) // 使用格式化字符串fmt.Println(p)        // 直接打印
}

这个String方法呢,也是定义结构体时常用的,以便输出结构体信息。这里我提一个问题:如果定义了Person的别名,打印其实例还会自动调用String()吗?验证很简单,读者可自行尝试,这里不做赘述。

二、方法与函数的区别

方法函数
和其他类型的关系绑定到特定类型独立于任何类型
语法func (receiver ReceiverType) MethodName(parameters) returnTypefunc FunctionName(parameters) returnType
调用方式通过类型的实例调用 instance.MethodName()直接调用 FunctionName()
作用域可以访问绑定类型的字段只能访问传入的参数
指定类型是否需要和传入类型一致不需要(可以随意传入值或指针)需要

关于最后一点,首先在utils中定义两个接收者不同的方法:

// 方法:接收者为值类型
func (p Person) PValue() {fmt.Println("Hello, my name is", p.Name)
}// 方法:接收者为指针类型
func (p *Person) PPointer() {fmt.Println("Hello, my name is", p.Name)
}

然后在main文件中调用:

// 函数:必须传入 Person 类型
func PrintPerson(p utils.Person) {fmt.Println("Person's name:", p.Name)
}func main() {// 创建值类型和指针类型的实例p1 := utils.Person{Name: "李华"}p2 := &utils.Person{Name: "张三"}p1.PPointer()   // 调用接收者为指针的方法,传入值类型PrintPerson(p1) // 调用函数,传入值类型p2.PValue()      // 调用接收者为值类型的方法,传入指针PrintPerson(*p2) // 调用函数,传入解引用的指针
}

程序输出如下:

Hello, my name is 李华
Person's name: 李华
Hello, my name is 张三
Person's name: 张三

相关文章:

golang学习笔记20-面向对象(二):方法与结构体【重要】

本节内容是面向对象的核心与基础,很重要。 注意:由于导包语句已经在19讲(笔记19:面向对象的引入)展示过了,所以这里就不展示了。 一、方法的定义与细节 方法是与特定类型(通常是结构体&#x…...

广州C++信奥老师解一本通题 1919:【02NOIP普及组】选数

【题目描述】 已知nn个整数x1,x2,……xn 以及一个整数K(K<n)。从n个整数中任选K个整数相加,可分别 得到一系列的和。例如当n4, k3 4个整数分别为3,7,12,19 3, 7,12,19时,可得全部的组合与它们的和为: 371222   371929   7121938  3121934 现在,要求你计算出和为…...

cas5.3统一登录前后端分离改造方案(源码)

cas5.3 为什么选择cas5.3 版本 5.3 版本是最新的支持jdk8 的版本,并且项目架构基于maven ,商业项目中jdk8 仍是主流,在考虑商业收益的情况下,如果客户不要求,不会升级jdk, 基于Maven的项目比gradle 简单,…...

【ComfyUI】控制光照节点——ComfyUI-IC-Light-Native

原始代码(非comfyui):https://github.com/lllyasviel/IC-Light comfyui实现1(600星):https://github.com/kijai/ComfyUI-IC-Light comfyui实现2(500星):https://github.c…...

LVS+keepalived整合负载均衡配置

准备三台服务器;负载均衡服务器192.168.45.136,后端机器1,92.168.45.135,后端机器2,192.168.45.138 在两台后端机器上安装nginx服务,yum install -y nginx,并且启动nginx服务,systemctl start …...

Goland无法使用debug的修复

现象goland在debug的时候,一直卡在打的断点处,释放断点程序就执行结束。 查看其他博客说是当使用老版本的goland,golang版本为高版本时就会出现debug问题,需要手动更换dlv。 接下来以window为例子: 第一步&#xff1…...

MySQL和Doris开窗函数LAG执行时的区别

目标表的表结构 CREATE TABLE point_value_status_color_tmp ( id bigint NOT NULL, org_id varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, device_id varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, origin_ti…...

都是小憨憨!

周五晚上约了俩哥们儿吃饭,天南海北地聊着。其中一个哥们儿 L 讲,他在外面如何辛苦跑业务,维系客户,拿单子……但却被合伙人说是合伙人拉了 L 一把,而且可以分分钟灭了 L。所以 L 感觉到很委屈。然后我们俩就劝说趁早决…...

高级java每日一道面试题-2024年9月30日-服务器篇[Redis篇]-Redis持久化有几种方式?

如果有遗漏,评论区告诉我进行补充 面试官: Redis持久化有几种方式? 我回答: Redis 是一个高性能的键值存储系统,常用于缓存、消息队列和实时数据分析等场景。为了保证数据的持久性,Redis 提供了两种主要的持久化方式:RDB(Redi…...

ICML 2024 论文分享┆一个简单且通用的交通预测提示调优框架

论文简介 本推文介绍了2024 ICML的优秀论文之一《FlashST: A Simple and Universal Prompt-Tuning Framework for Traffic Prediction》。论文的核心目标是通过整合空间和时间因素,精准地预测和分析交通流量的动态变化。然而,在交通预测领域&#xff0c…...

【C++打怪之路Lv4】-- 类和对象(中)

🌈 个人主页:白子寰 🔥 分类专栏:C打怪之路,python从入门到精通,数据结构,C语言,C语言题集👈 希望得到您的订阅和支持~ 💡 坚持创作博文(平均质量分82)&#…...

滚雪球学MySQL[1.1讲]:MySQL简介与环境配置

全文目录: 前言1. MySQL简介与环境配置1.1 MySQL简介什么是MySQLMySQL的历史和版本MySQL的应用场景 1.2 安装与配置安装MySQL(Windows、Linux、macOS)配置文件解析(my.cnf)启动与停止MySQL服务 1.3 MySQL客户端工具MyS…...

Llama微调以及Ollama部署

1 Llama微调 在基础模型的基础上,通过一些特定的数据集,将具有特定功能加在原有的模型上。 1.1 效果对比 特定数据集 未使用微调的基础模型的回答 使用微调后的回答 1.2 基础模型 基础大模型我选择Mistral-7B-v0.3-Chinese-Chat-uncensored&#x…...

中关村环球时尚产业联盟 东晟时尚产业创新中心成立

2024年9月6日,中关村环球时尚产业联盟与东晟时尚创新科技(北京)有限公司于中关村科技园东城园举行了隆重的战略合作签约仪式。 中关村科技园东城园领导发表了致辞,并表示东城区作为首都北京的核心区域,拥有深厚的历史…...

基于SSM的宠物领养管理系统的设计与实现 (含源码+sql+视频导入教程+文档+PPT)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的宠物领养管理系统2拥有两种角色 管理员:宠物分类管理、领养管理、宠物商品管理、用户管理、寄存管理、丢失信息管理、订单管理等 用户:登录注册、收藏评…...

为什么要配置环境变量?

在 Windows 操作系统中配置环境变量有多个重要的原因,这些原因与软件开发、系统管理和日常使用密切相关。以下是一些主要的原因: 1. 系统路径(PATH) 可执行文件的位置:PATH 环境变量用于指定操作系统在何处查找可执行…...

条件熵公式详细解释、举例说明计算步骤

公式 7-4 是条件熵的表达式: E ( Y ∣ X ) ∑ i 1 m p ( X x i ) E ( Y ∣ X x i ) E(Y|X) \sum_{i1}^m p(X x_i) E(Y | X x_i) E(Y∣X)i1∑m​p(Xxi​)E(Y∣Xxi​) 这个公式表示的是条件熵,它是衡量在已知某一特征 X X X 的情况下&#xff0c…...

颍川陈氏始祖陈寔逆势崛起的原由(一)不屈的努力

园子说颍川 按陈寔的出身,与当官是风马牛不相及的。 东汉末年的社会,朝中外戚、宦官当道,地方则由世家大族把持,郡县的政治经济资源都由他们掌控分配,平民以及中小地主很难有出头之日,弄不好就被兼并了。…...

golang小项目1-家庭收支记账系统

项目地址:golang小项目 参考资料:尚硅谷golang教程P229 家庭收支记账系统 1. 系统简介 1.1 项目背景 在现代社会中,家庭的财务管理显得尤为重要。随着生活成本的不断上升,家庭需要有效地记录和分析收支情况,以确保…...

Visual Studio Code下载安装及汉化

官网:https://code.visualstudio.com/ 按照指示一步步操作即可: 汉化:...

MySQL—触发器详解

基本介绍 触发器是与表有关的数据库对象,在 INSERT、UPDATE、DELETE 操作之前或之后触发并执行触发器中定义的 SQL 语句。 触发器的这种特性可以协助应用在数据库端确保数据的完整性、日志记录、数据校验等操作。 使用别名 NEW 和 OLD 来引用触发器中发生变化的记…...

钉钉H5微应用Springboot+Vue开发分享

文章目录 说明技术路线注意操作步骤思路图 一、创建钉钉应用二、创建java项目三、创建vue项目(或uniapp项目),npm引入sdk的依赖四、拥有公网域名端口。开发环境可以使用(贝锐花生壳等工具)五、打开钉钉开发者平台&…...

项目:微服务即时通讯系统客户端(基于C++QT)]四,中间界面搭建和逻辑准备

四,中间界面搭建 前言:当项目越来越复杂的时候,或许画草图是非常好的选择 一,初始化中间窗口initMidWindow void mainWidget::initMidWindow() {//使用网格布局进行管理QGridLayout* layout new QGridLayout();//距离上方 20px 的距离&…...

【C语言】指针详解(一)

个人主页 : zxctscl 如有转载请先通知 文章目录 1.内存与地址2.指针变量与地址2.1 取地址操作符&2.2 指针变量2.3 指针类型2.4 解引用操作符2.5 指针变量的大小 3. 指针变量类型的意义3.1 指针的解引用 4. const修饰指针4.1 const修饰变量4.2 const修饰指针变量…...

unity3D雨雪等粒子特效不穿透房屋效果实现(粒子不穿透模型)

做项目有时候会做天气模拟,模拟雨雪天气等等。但是容易忽略一个问题,就是房屋内不应该下雨或者下雪,这样不就穿帮了嘛。 下面就粒子穿透物体问题做一个demo。 正常下雨下雪在室内的话,你可以看到,粒子是穿透建筑的。 那要怎么模拟真实的雨雪天气,不让粒子穿透房屋建筑呢…...

ROS2安装cartographer

2. 安装Cartographer和Cartographer ROS 使用apt安装(推荐): bash sudo apt install ros-humble-cartographer-ros或者,从源代码安装: bash sudo apt-get update sudo apt-get install -y python3-wstool python3…...

kafka测试

1】确认 ZooKeeper 服务状态 为了进一步确认 ZooKeeper 服务的状态,你可以执行以下操作: 检查 ZooKeeper 服务状态: docker ps 确保 ZooKeeper 容器正在运行。 检查 ZooKeeper 日志: docker logs zookeeper 查看最新的日志条目&…...

总结C/C++中内存区域划分

目录 1.C/C程序内存分配主要的几个区域: 2.内存分布图 1.C/C程序内存分配主要的几个区域: 1、栈区 2、堆区 3、数据段(静态区) 4.代码段 2.内存分布图 如图: static修饰静态变量成员——放在静态区 int globalVar 是…...

第168天:应急响应-ELK 日志分析系统Yara规则样本识别特征提取规则编写

目录 案例一:ELK 搭建使用-导入文件&监控日志&语法筛选 案例二:Yara 规则使用-规则检测&分析特征&自写规则 案例一:ELK 搭建使用-导入文件&监控日志&语法筛选 该软件是专业分析日志的工具,但是不支持安…...

MySQL 面试题及答案

MySQL 面试题及答案: 一、基础问题 什么是数据库索引?有哪些类型? 答:数据库索引是一种数据结构,用于提高数据库查询的效率。它就像一本书的目录,可以快速定位到特定的数据行。 类型主要有: …...

个人是否可以做网站/软件培训机构排名

EL操作操作对象的方式 l 操作变量和常量:${name}、${8}; l 操作List和数组:${list[0]}、${arr[0]}; l 操作bean的属性:${person.name}、${person[‘name’]},对应person.getName()方法; l 操…...

英国T4学生签证 可以做网站吗/个人优秀网页设计

树莓派zero系统里不知道为什么没有pip3 手动安装很麻烦 运行以下指令 可以快速完成安装 sudo apt-get install python3-pip...

单位网站维护 网站建设岗位/seo顾问服务咨询

一、开关电源的电路组成开关电源的主要电路是由输入电磁干扰滤波器(EMI)、整流滤波电路、功率变换电路、PWM控制器电路、输出整流滤波电路组成。辅助电路有输入过欠压保护电路、输出过欠压保护电路、输出过流保护电路、输出短路保护电路等。开关电源的电路组成方框图如下&#…...

如何seo网站/本站3天更换一次域名yw

前言 ​Spring 正如其名字,给开发者带来了春天,Spring 是为解决企业级应用开发的复杂性而设计的一款框架,其设计理念就是:简化开发。 Spring 框架中最核心思想就是: IOC(控制反转)&#xff1a…...

微信商城怎么弄/培训seo哪家学校好

一、基本了解 首先,我们先了解一下什么是SVG格式 百度百科:SVG格式 SVG是一种图像文件格式,它的英文全称为Scalable Vector Graphics,意思为可缩放的矢量图形。它是基于XML(Extensible Markup Language)&a…...

网站seo应用/百度网站认证

题目描述 八尾勇喜欢吃苹果。她今天吃掉了 x(0\le x \le 100)x(0≤x≤100) 个苹果。英语课上学到了 apple 这个词语,想用它来造句。如果她吃了 1 个苹果,就输出 Today, I ate 1 apple.;如果她没有吃,那么就把 1 换成 0&#xff1…...