Go语言面向对象编程(二)方法

Go语言的面向对象编程 我们可以使用type关键字定义一个结构体。例如,以下是一个表示PersongoAge int这里,PersonName和Age。go在这里,p是Person类型的接收者。通过p,我们可以访问Person的字段。go任何实现了Greet方法的类型都将被视为Greeter接口的实现。 阅读详情

1.方法

       在面向对象编程中,一个对象其实也就是一个简单的值或者一个变量,在这个对象中会包含一些函数,这种带有接收者的函数,我们称为方法(method)。本质上,一个方法则是一个和特殊类型关联的函数。

       一个面向对象的程序会用方法来表达其属性和对应的操作,这样使用这个对象的用户就不需要直接去操作对象,而是借助方法来做这些事情。

      在Go语言中,可以给任意自定义类型(包括内置类型,但不包括指针类型)添加相应的方法。

      方法总是绑定对象实例,并隐式将实例作为第一实参(receiver),方法的语法如下:

func  (receiver   ReceiverType)  funcName(parameters)  (results)

  • 参数receiver可以任意命名。如方法中未曾使用,可省略参数名。
  • 参数receiver类型就是T或*T。基类型T不能是接口或指针。
  • 不支持重载方法,也就是说,不能定义名字相同但是不同参数的方法。

2.面向对象编程与面向过程编程对比

package main

import (
	"fmt"
)

//实现两个数相加
//面向过程
func Add01(a, b int) int {
	return a + b
}

//面向对象,方法:给某个类型绑定一个函数
type long int

//tmp叫接收者,接收者就是传递的一个参数
func (tmp long) Add02(other long) long {
	return tmp + other
}

func main() {
	result := Add01(1, 2) //普通函数调用方式
	fmt.Println("result = ", result)

	//定义一个变量
	var a long = 2
	//调用方法格式:变量名.函数(所需参数)
	r := a.Add02(3)
	fmt.Println("result = ", r)

	//面向对象只是换了一种表现形式
}

输出:

3.为结构体类型添加方法

package main

import (
	"fmt"
)

type Person struct {
	name string
	sex  byte
	age  int
}

//带有接收者的函数叫方法
func (tmp Person) PrintInfo() {
	fmt.Println("tmp = ", tmp)
}

//通过一个函数,给成员赋值
func (p *Person) SetInfo(n string, s byte, a int) {
	p.name = n
	p.sex = s
	p.age = a
}

func main() {
	//定义同时初始化
	p := Person{"mike", 'm', 18}
	p.PrintInfo()

	//定义一个结构体类型
	var p2 Person                  //p2为面型对象中的对象
	(&p2).SetInfo("yoyo", 'n', 22) //SetInfo为成员函数
	p2.PrintInfo()
}

输出:

4.值语义和引用语义

package main

import (
	"fmt"
)

type Person struct {
	name string
	sex  byte
	age  int
}

//修改成员变量的值
//接收者为普通变量,非指针,值语义,一份拷贝
func (p Person) SetInfoValue(name string, sex byte, age int) {
	p.name = name
	p.sex = sex
	p.age = age
	fmt.Printf("SetInfoValue &p = %p\n", &p)
}

//接收者为指针变量,引用传递
func (p *Person) SetInfoPointer(name string, sex byte, age int) {
	p.name = name
	p.sex = sex
	p.age = age
	fmt.Printf("SetInfoPointer &p = %p\n", p)
}

func main() {
	var s1 Person = Person{"go", 'm', 22}
	fmt.Printf("&s1 = %p\n", &s1)

	//值语义,
	s1.SetInfoValue("mike", 'm', 18)
	fmt.Println("s1 = ", s1) //打印内容

	//引用语义
	var s2 Person = Person{"go", 'm', 22}
	fmt.Printf("&s2 = %p\n", &s2)
	(&s2).SetInfoPointer("yoyo", 'm', 18)
	fmt.Println("s2 = ", s2)
}

输出:

5.方法集

【1】指针变量的方法集

package main

import (
	"fmt"
)

type Person struct {
	name string
	sex  byte
	age  int
}

func (p Person) SetInfoValue() {
	fmt.Println("SetInfoValue")
}

func (p *Person) SetInfoPointer() {
	fmt.Println("SetInfoPointer")
}

func main() {
	//假如,结构体变量是一个指针变量,他能够调用那些方法,这些方法是一个集合,简称方法集
	p := &Person{"mike", 'm', 18}
	p.SetInfoPointer()    //func (p *Person) SetInfoPointer()
	(*p).SetInfoPointer() //把(*p)转化为p然后调用

	//内部做的转换,先把指针,转成*p后再调用
	p.SetInfoValue()
}

输出:

【2】指针变量的方法集

package main

import (
	"fmt"
)

type Person struct {
	name string
	sex  byte
	age  int
}

func (p Person) SetInfoValue() {
	fmt.Println("SetInfoValue")
}

func (p *Person) SetInfoPointer() {
	fmt.Println("SetInfoPointer")
}

func main() {
	p := Person{"mike", 'm', 18}
	//内部,先把p转为&p再调用
	p.SetInfoPointer() //func (p *Person) SetInfoPointer()
}

输出:

6.方法的继承

package main

import (
	"fmt"
)

type Person struct {
	name string
	sex  byte
	age  int
}

//有个学生继承Person字段,成员和方法都继承了
type Student struct {
	Person
	id   int
	addr string
}

func (tmp *Person) PrintInfo() {
	fmt.Printf("name=%s,sex=%c,age=%d", tmp.name, tmp.sex, tmp.age)
}

func main() {
	s := Student{Person{"mike", 'm', 18}, 1, "bj"}
	s.PrintInfo()  //s可以使用Person的方法
}

输出:

7.方法的重写

package main

import (
	"fmt"
)

type Person struct {
	name string
	sex  byte
	age  int
}

//有个学生继承Person字段,成员和方法都继承了
type Student struct {
	Person
	id   int
	addr string
}

//Student也实现了一个方法,这个方法和Person的方法同名,叫重写
func (tmp *Student) PrintInfo() {
	fmt.Printf("Student name=%s,sex=%c,age=%d\n", tmp.name, tmp.sex, tmp.age)
}

func (tmp *Person) PrintInfo() {
	fmt.Printf("Person name=%s,sex=%c,age=%d\n", tmp.name, tmp.sex, tmp.age)
}

func main() {
	s := Student{Person{"mike", 'm', 18}, 1, "bj"}
	//就近原则,先找本作用域的方法,找不到再用继承的方法
	s.PrintInfo()

	//显示调用继承的方法
	s.Person.PrintInfo()
}

输出:

8.方法值

package main

import (
	"fmt"
)

type Person struct {
	name string
	sex  byte
	age  int
}

func (p Person) SetInfoValue() {
	fmt.Printf("SetInfoValue: %p, %v\n", &p, p)
}

func (p *Person) SetInfoPointer() {
	fmt.Printf("SetInfoPointer: %p, %v\n", p, p)
}

func main() {
	p := Person{"mike", 'm', 18}
	fmt.Printf("main: %p, %v\n", &p, p)

	p.SetInfoPointer() //传统调用方式

	//保存方法入口地址
	pFunc := p.SetInfoPointer //这个就是方法值,无需再传递接收者。
	pFunc()                   //等价于p.SetInfoPointer()

	vFunc := p.SetInfoValue
	vFunc() //等价于p.SetInfoValue()
}

输出:

9.方法表达式

package main

import (
	"fmt"
)

type Person struct {
	name string
	sex  byte
	age  int
}

func (p Person) SetInfoValue() {
	fmt.Printf("SetInfoValue: %p, %v\n", &p, p)
}

func (p *Person) SetInfoPointer() {
	fmt.Printf("SetInfoPointer: %p, %v\n", p, p)
}

func main() {
	p := Person{"mike", 'm', 18}
	fmt.Printf("main: %p, %v\n", &p, p)

	//方法值pFunc := p.SetInfoPointer 隐藏了接收者
	//方法表达式
	f := (*Person).SetInfoPointer
	f(&p) //显式把接收者传递过去 ----》p.SetInfoPointer(&p)

	f2 := (Person).SetInfoValue
	f2(p) //显式把接收者传递过去 ----》p.SetInfoValue(p)
}

输出:

深入理解Go语言的面向对象编程、Git与GitHub的使用 本文深入介绍了Go语言在面向对象编程中的应用。虽然Go不支持传统的继承,但通过组合(composition)和接口(interface),我们可以模拟OOP的一些特性。文章通过示例代码展示了如何使用方法将函数关联到类型,以及如何嵌入类型来创建层次结构,强调了组合并非继承的概念。除此之外,还详细讲解了Git和GitHub的基本使用,包括克隆仓库、查看状态、提交和推送更改、管理分支和标签等常用命令。最后,文章简要介绍了Go语言的调试工具Delve,展示了如何使用它来设置断点、单步执行和查看变量,从而帮助开发者高 阅读详情

相关推荐

Go 语言中创建方法

Go 语言中如何创建方法

禅与代码的艺术 1706

Go语言面向对象编程

一、概述Go语言是一门支持面向对象编程的语言,它的面向对象特性包括类、对象、封装、继承和多态等。在本文中,我们将详细介绍Go语言面向对象编程的基本概念和思想。二、类和对象在面向对象编程中,类是一种抽象的概念,它描述了一类具有相同属性和行为的对象。对象是类的一个实例,它具有类定义的属性和行为。在Go语言中,类的概念被替换成了结构体(struct)和接口(interface)的概念。结构体用于描述对象的属性,接口用于描述对象的行为。Age int在上面的代码中,我们定义了一个名为Person。

Kali与编程 1229

Go语言和C++语言在面向对象编程方面有哪些不同?

总的来说,Go语言和C++语言在面向对象编程方面采用了不同的实现方式和机制,各有其特点和优势,适用于不同的应用场景。结构体,然后通过在结构体类型上定义方法来实现类似类中成员函数的功能。虽然不是严格意义上的继承,但在一定程度上实现了类似的功能。类型使用时,调用接口中的方法会根据实际对象(是虚函数,所以会根据实际对象类型(结构体)来执行相应的函数。结构体实现了该接口。

alankuo的专栏 1009

Go:Go语言中的“面向对象”

Go语言中,实际上并没有“对象”、“类”、“继承”等概念,但是在实际的项目开发中,为了提高代码的可维护性、可扩展性和可复用性,我们不得不使用面向对象的设计理念来编码。因此,我们需要使用Go中的组合、接口等机制实现类似的面向对象特性,如继承、封装和多态。

Liu_y_xin的博客 1205

【Golang】Go语言中如何面向对象?

Go语言(Golang)虽然不是一个纯粹的面向对象编程语言,但它通过结构体(Struct)、接口(Interface)等机制,提供了面向对象的编程范式。 在实际的项目开发中,使用面向对象的理念可以显著提高代码的可维护性、可扩展性和可复用性。

景天科技苑 4万+

【Golang】Go语言接口与多态

在Go语言中,接口(Interface)是一个重要的特性,它允许我们定义一组方法但不实现它们,任何类型只要实现了这些方法,就被认为是实现了该接口。 接口体现了程序设计的多态、高内聚、低耦合的思想,是实现面向对象编程中多态性的关键工具。

景天科技苑 4万+

go实现面向对象编程

golang面向编程的实现

m0_57547705的博客 639

【两方演化博弈代码复现】:双方演化博弈的原理、概率博弈仿真、相位图、单个参数灵敏度演化

演化博弈论是研究个体在特定环境中如何通过策略选择与其他个体进行互动的学科。这一理论在生物学、经济学和社会科学等多个领域都有广泛应用。本文将深入探讨双方演化博弈的原理及其过程,并解读一段 MATLAB 代码,展示如何模拟这一过程。

当回首往事的时候,不会因虚度年华而悔恨,也不会因碌碌无为而羞愧。 6198

go语言之面向对象编程

1. 结构体 go中没有class这个概念,但有struct 结构体的所有字段在内存中是连续的 结构体类型与结构体类型之间也可以相互转换,但是转换需要有完全相同的字段 名字,个数,类型 type A struct{ Num int } type B struct{ Num int } var a A var b B a=A(b) 1.1 结构体的声明 type 结构体名称 struct{ field1 type filed2 type } 1.2 结构体的使用 方式1 p1:=P

weixin_44390164的博客 701

告别蓝牙音质妥协:用ESP32和PCM5102搭建WiFi无损音频播放器(附完整代码)

本文详细介绍了如何利用ESP32微控制器和PCM5102 DAC芯片构建一套完整的WiFi无损音频流媒体系统,彻底摆脱蓝牙协议的音质束缚。从硬件原理到软件实现,包括核心器件选型、电路设计、I2S音频驱动实现以及系统优化方案,帮助音频发烧友实现高保真无线音频传输。

weixin_30733003的博客 542

【UE4】PMC程序化生成戈德堡多面体详解(六边形星球)

游戏实机录屏 【魔方超新星】30天独立开发PCG Minigame《盖亚计划》作品展示,尚有不足,大佬轻喷 目录 游戏实机录屏 一、简介 二、设计思路 2.1 Disco Ball 2.2 Fibonacci Sphere 2.3 Goldberg Polyhedron 2.3.1 细分+对偶(最终方案) 2.3.2 对偶+截角(更优) 三、参考文献 一、简介 在制作Minigame初期,游戏风格想模仿《文明6》与《Polygonal Planet Proje...

ColorGalaxy 5930

【Go语言】面向对象编程(二):通过组合实现类的继承和方法重写

的方式间接实现类似的功能,所谓组合,就是将一个类型嵌入到另一个类型,从而构建新的类型结构。类的定义及其内部数据的定义可以看作是类的属性,基于类定义的函数方法则是类的成员方法。要实现面向对象的编程,就必须实现面向对象编程的三大特性:封装、继承和多态。Go 语言中,没有直接提供继承相关的语法实现,可以通过。需要注意组合的不同类型之间包含同名方法,比如。没有重写该方法,直接在。类的属性和成员方法。

Python、Golang、大数据 845

数学:箭头符号→(to)都表示什么意义?

数学符号“→”在不同领域有不同含义:在逻辑中表示“蕴含”(p→q);在函数中表示映射关系(f:A→B);在极限中表示变量趋近(x→a);在推导过程中表示推理方向(A→B)。此外,它也可能用于向量表示或数列趋势。其具体含义需结合上下文判断,核心应用场景包括逻辑运算、函数定义、极限分析和数学推导等。

shunzi2016的博客 5566

go语言实现多态的两个方法

多态(Polymorphism)是面向对象编程(OOP)中的一个核心概念,它允许不同的对象对同一消息做出响应,即同一个接口可以被不同的实例以不同的方式实现。多态性使得程序在运行时可以动态地决定调用哪个对象的方法,从而提高了代码的灵活性和可扩展性。在 Go 语言中,虽然没有传统面向对象语言中的类和继承,但通过接口(interface)机制实现了多态。Go 的接口是一种类型,它定义了一组方法签名,但不实现这些方法。任何实现了接口中所有方法的类型都隐式地实现了该接口。

xiong___jie的博客 492

WinCC动态选择报警记录案例

本例中需要确认查询的时间段以及查询的关键字,然后通过一个按钮来执行报警数据查询脚本,并把查询出的结果加载到当前报警控件中。<本例中数据查询脚本的思路是根据选项组所选定的参数加载相应的归档变量到在线趋势控件,根据设定的查询时间范围设定控件时间轴的开始时间及结束时间。本文以 WinCC V8.0为例,介绍如何动态的查询WinCC报警记录,包括关键字查询/时间&关键字查询,如图1所示。<在WinCC变量管理中创建不同的变量组,并在变量组下创建相应的变量,如图2 所示(下图并非实际变量值)。

weixin_45072604的博客 2708

别再手动调参数了!用3ds Max的tyDiffusion插件,5分钟搞定AI动态纹理生成

本文介绍了3ds Max的tyDiffusion插件如何通过AI技术快速生成动态纹理,大幅提升3D美术师的工作效率。从火焰、水流到布料飘动,tyDiffusion能在5分钟内完成传统手工需要数小时的任务,且效果更自然。文章详细解析了插件的核心功能、实战配置及进阶应用,帮助用户轻松实现AI动态纹理生成。

weixin_30919429的博客 667

Go语言-面向对象编程实例

编写一个 Student结构体包含 name、gender、age、id、score 字段,分别为 string、string、imnt、int、float64类型。结构体中声明一个 say方法,返回 sting类型,方法返回信息中包含所有字段值。在 main 方法中,创建 Student结构体实例(变量),并访问 say方法,并将调用结果打印输出。案例2 编写一个立方体结构体,存放立方体的长宽高,使用方法返回该立方体的体积。

Hunter_11的博客 237

第4篇:使用 NModbus 库快速搭建 Modbus TCP 通信(从零开始用 C# 开发 Modbus 上位机)

本文介绍了如何使用 NModbus 库快速搭建 Modbus TCP 上位机通信程序。通过安装 NModbus4 NuGet 包,开发者可以轻松实现 Modbus TCP 连接,无需手动处理底层协议细节。文章详细演示了核心功能实现: 创建 TCP 客户端连接设备 读取保持寄存器(功能码0x03) 写入单个寄存器(功能码0x06) 关闭连接释放资源 提供完整C#示例代码,包含初始化连接、数据读写等关键操作,帮助开发者快速构建Modbus TCP通信应用。相比手动实现,NModbus库大幅简化了开发流程,特别适

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1045

golang 面向对象

go不像c++ java php等有class类及面向对象直接特征, 但是它也支持面向对象的写法

bushuwei的博客 271

【制作100个unity游戏之30】使用unity实现一款2d俯视角RPG战斗游戏,主要使用InputSystem+有限状态机+A*寻路实现(完结,附带项目源码)

【制作100个unity游戏之30】使用unity实现一款2d俯视角RPG战斗游戏,主要使用InputSystem+有限状态机+A*寻路实现

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4653

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【Golang】第八弹----面向对象编程

一篇搞定GO面向对象编程特性、结构体、方法、封装、继承、多态

2302_80713883的博客 2693

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Go-Golang学习总结笔记

资源 某hub会审核不通过,自己去找吧 书籍 网站 基础 go官方中文网 菜鸟教程 C语言网 go语言中文网 golang系列 视频 基础 安装 依赖管理 数据类型 变量和常量 流程控制 函数 包 面向对象编程 提高 ...

关注网络安全、云原生安全 2万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

PentestGPT 快速上手:10 分钟跑通一个 AI 渗透测试环境

PentestGPT 是一个由大语言模型驱动的 AI 渗透测试框架,你把一个目标地址和一句任务描述交给它,它自己驱动安全工具完成侦察、利用尝试、报告输出,全过程在终端里实时可见。它适合 CTF(Capture The Flag,网络安全攻防竞赛)练习者和需要对自有资产反复做安全测试的工程师。 ## 先确认 Docker、内存和 LLM 凭证 开始之前把这几样东西备齐: - **Docker*

gitblog_00424的博客 674

Go语言---面向对象编程-匿名字段、同名字段、方法、方法集、方法的继承与重写、方法值与方法表达式

go语言面向对象编程-匿名字段、同名字段、方法、方法集、方法的继承与重写、方法值与方法表达式

m0_73537205的博客 1751
上一篇: Go语言面向对象编程(一)匿名字段
下一篇: Go语言面向对象编程(三)接口
random_w
博客等级 码龄9年 130粉丝 168原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值