GO语言中的方法

Go语言中的方法详解 在Go语言中,方法可以与任何自定义类型相关联,而不仅仅是结构体类型。当方法的接收器是指针类型时,该方法可以修改接收器的状态。总结一下,Go语言中的方法提供了一种在类型上执行操作的机制。Go语言是一种简洁、高效的编程语言,它提供了一种灵活的方法机制,使得开发人员可以定义和使用方法来操作自定义类型。在本文中,我们将详细讨论Go语言中方法的概念、语法和使用方法,并提供相应的源代码示例。它们允许我们在类型上执行操作,并在该类型的实例上调用这些操作。是方法关联的类型,可以是具体的类型或指针类型。 阅读详情

方法

面向对象编程(OOP)就成为了称霸工程界和教育界的编程范式,所以之后几乎所有大规模被应用的语言都包含了对OOP的支持,go语言也不例外。

方法声明

在函数声明时,在其名字之前放上一个变量,即是一个方法。这个附加的参数会将该函数附加到这种类型上,即相当于为这种类型定义了一个独占的方法。

package geometry
import "math"
type Point struct{ X, Y float64 }
func (p Point) Distance(q Point) float64 {
return math.Hypot(q.X-p.X, q.Y-p.Y)
}

在Go语言中,我们并不会像其它语言那样用this或者self作为接收器;我们可以任意的选择接收器的名字。
在方法调用过程中,接收器参数一般会在方法名之前出现。这和方法声明是一样的,都是接收器参数在方法名字之前。下面是例子:

p := Point{1, 2}
q := Point{4, 6}
fmt.Println(Distance(p, q)) // "5", function call
fmt.Println(p.Distance(q)) // "5", method call

可以看到,上面的两个函数调用都是Distance,但是却没有发生冲突。第一个Distance的调用实际上用的是包级别的函数geometry.Distance,而第二个则是使用刚刚声明的Point,调用的是Point类下声明的Point.Distance方法。

这种p.Distance的表达式叫做选择器,因为他会选择合适的对应p这个对象的Distance方法来执行。选择器也会被用来选择一个struct类型的字段,比如p.X。由于方法和字段都是在同一
命名空间,所以如果我们在这里声明一个X方法的话,编译器会报错,因为在调用p.X时会有歧义。

对于一个给定的类型,其内部的方法都必须有唯一的方法名,但是不同的类型却可以有同样的方法名。

基于指针对象的方法

当调用一个函数时,会对其每一个参数值进行拷贝,如果一个函数需要更新一个变量,或者函数的其中一个参数实在太大我们希望能够避免进行这种默认的拷贝,这种情况下我们就需要用到指针了。对应到我们这里用来更新接收器的对象的方法,当这个接受者变量本身比较大时,我们就可以用其指针而不是对象来声明方法,如下:

func (p *Point) ScaleBy(factor float64) {
p.X *= factor
p.Y *= factor
}

这个方法的名字是 (*Point).ScaleBy 。这里的括号是必须的;没有括号的话这个表达式可能会被理解为 *(Point.ScaleBy) 。
在现实的程序里,一般会约定如果Point这个类有一个指针作为接收器的方法,那么所有Point的方法都必须有一个指针接收器,即使是那些并不需要这个指针接收器的函数。我们在这里

Nil也是一个合法的接收器类型

就像一些函数允许nil指针作为参数一样,方法理论上也可以用nil指针作为其接收器,尤其当nil对于对象来说是合法的零值时,比如map或者slice。在下面的简单int链表的例子里,nil代表的是空链表:

type IntList struct {
Value int
Tail *IntList
}
// Sum returns the sum of the list elements.
func (list *IntList) Sum() int {
if list == nil {
return 0
}
return list.Value + list.Tail.Sum()
}

当你定义一个允许nil作为接收器值的方法的类型时,在类型前面的注释中指出nil变量代表的意义是很有必要的。

通过嵌入结构体来扩展类型

来看看ColoredPoint这个类型:

import "image/color"
type Point struct{ X, Y float64 }
type ColoredPoint struct {
Point
Color color.RGBA
}

我们完全可以将ColoredPoint定义为一个有三个字段的struct,但是我们却将Point这个类型嵌入到ColoredPoint来提供X和Y这两个字段。内嵌可以使我们在定义ColoredPoint时得到一种句法上的简写形式,并使其包含Point类型所具有的一切字段,然后再定义一些自己的。如果我们想要的话,我们可以直接认为通过嵌入的字段就是ColoredPoint自身的字段,而完全不需要在调用时指出Point,比如下面这样。

var cp ColoredPoint
cp.X = 1
fmt.Println(cp.Point.X) // "1"
cp.Point.Y = 2
fmt.Println(cp.Y) // "2"

对于Point中的方法我们也有类似的用法,我们可以把ColoredPoint类型当作接收器来调用Point里的方法,即使ColoredPoint里没有声明这些方法:

red := color.RGBA{255, 0, 0, 255}
blue := color.RGBA{0, 0, 255, 255}
var p = ColoredPoint{Point{1, 1}, red}
var q = ColoredPoint{Point{5, 4}, blue}
fmt.Println(p.Distance(q.Point)) // "5"
p.ScaleBy(2)
q.ScaleBy(2)
fmt.Println(p.Distance(q.Point)) // "10"

Point类的方法也被引入了ColoredPoint。用这种方式,内嵌可以使我们定义字段特别多的复杂类型,我们可以将字段先按小类型分组,然后定义小类型的方法,之后再把它们组合起来。

方法值和方法表达式

我们经常选择一个方法,并且在同一个表达式里执行,比如常见的p.Distance()形式,实际上将其分成两步来执行也是可能的。p.Distance叫作“选择器”,选择器会返回一个方法"值"->一
个将方法(Point.Distance)绑定到特定接收器变量的函数。这个函数可以不通过指定其接收器即可被调用;即调用时不需要指定接收器(译注:因为已经在前文中指定过了),只要传入函数的参数即可:

p := Point{1, 2}
q := Point{4, 6}
distanceFromP := p.Distance // method value
fmt.Println(distanceFromP(q)) // "5"
var origin Point // {0, 0}
fmt.Println(distanceFromP(origin)) // "2.23606797749979", sqrt(5)
scaleP := p.ScaleBy // method value
scaleP(2) // p becomes (2, 4)
scaleP(3) // then (6, 12)
scaleP(10) // then (60, 120)

在一个包的API需要一个函数值、且调用方希望操作的是某一个绑定了对象的方法的话,方法"值"会非常实用(=_=真是绕)。举例来说,下面例子中的time.AfterFunc这个函数的功能是在指定的延迟时间之后来执行一个(译注:另外的)函数。且这个函数操作的是一个Rocket对象r

type Rocket struct { /* ... */ }
func (r *Rocket) Launch() { /* ... */ }
r := new(Rocket)
time.AfterFunc(10 * time.Second, func() { r.Launch() })
12、Go语言中的方法详解 本文详细解析了Go语言中的方法,包括方法声明、与泛型类型的结合、可见性和调用规则,以及方法签名的概念。同时探讨了方法的多种使用场景,例如自定义类型的行为、逻辑封装和接口实现,并介绍了性能优化技巧和多态性的实现方式。文章还深入讲解了方法的高级用法、并发调用、错误处理及测试方法,最后总结了编写高质量Go代码的最佳实践。通过学习这些内容,开发者可以更加灵活地运用Go语言中的方法特性,提高代码质量和可维护性。 阅读详情

相关推荐

ads设计Doherty功放(1)

Doherty功放的设计

qq_40995480的博客 2万+

【Go】Go语言中的方法

本文介绍了Go语言中“方法”的相关内容。

weixin_44211968的博客 2799

保姆级教程:在ROS2 Humble上搞定Livox Mid-360雷达,从IP配置到Rviz点云显示

本文提供在ROS2 Humble上配置Livox Mid-360激光雷达的完整教程,涵盖从IP设置到Rviz点云显示的全流程。详细解析硬件连接、驱动编译、配置文件优化及常见问题排查,帮助开发者快速搭建开发环境并实现高效点云可视化。

weixin_30955617的博客 184

关于Go语言中的函数方法

关于Go语言中的函数方法方法是什么函数和方法的区别Go中的“多态” 方法是什么 func (recv receiver_type) methodName(parameter_list) (return_value_list) { … } 在 Go 语言中,结构体就像是类的一种简化形式,那么面向对象程序员可能会问:类的方法在哪里呢? 在 Go 中有一个概念,它和方法有着同样的名字,并且大体上意思相同:Go 方法是作用在接收者(receiver)上的一个函数,接收者是某种类型的变量。因此方法是一种特殊类型的函数

面向生活编程 741

从入门到精通:MediaGo跨平台部署全攻略,Docker+NAS实战案例深度拆解!

本篇将深入解析开源媒体处理工具MediaGo的运作机制,该软件具备跨平台兼容性,支持Windows、MacOS及Linux三大主流操作系统。其核心创新在于采用模块化架构设计,用户无需额外依赖任何插件即可完成快速部署。作为GitHub平台上的开源项目,该工具特别注重用户体验设计,通过Docker容器化方案可无缝接入各类网络存储设备,显著优化系统资源占用并提升数据处理效率。以飞牛云NAS系统为实施案例,本文将详细展示本地化部署全流程。

Yawesh的博客 1956

腾讯云TDSQL MySQL版 - 开发指南兼容性

语言结构 分布式实例支持所有 MySQL 使用的文字格式,包括: String Literals Numeric Literals Date and Time Literals Hexadecimal Literals Bit-Value Literals Boolean Literals NULL Values String Literals String Literals 是一个 bytes 或者 characters 的序列,两端被单引号'或者双引号"包围,TDSQL MySQL版

weixin_43872058的博客 911

【golang基础】go语言中的方法和interface的实现

我们先来看一道面试题:以下代码能编译过去吗?为什么? package main import ( "fmt" ) type People interface { Speak(string) string } type Stduent struct{} func (stu *Stduent) Speak(think ...

weixin_33962923的博客 322

在ABAQUS中使用VUMAT子程序实现Hashin失效准则的详细解析与实践:深入探讨复合材料模拟仿真的高级编程技巧

Hashin失效准则是由材料科学家Shlomo Hashin于1962年提出的一种基于能量方法的多向失效理论,主要用于预测复合材料的破坏行为。与传统的单向失效理论不同,Hashin准则考虑了材料内部的多种独立破坏机制,如基体断裂、界面脱粘、纤维断裂等,这些机制在不同应力状态下可能同时或分别发生。通过计算各个机制的能量释放率,Hashin失效准则能够更为准确地预测复合材料在复杂应力状态下的破坏行为。

qq_38334677的博客 1950

Go最全Go语言中的方法:深入理解接收者_go的接收者(2),含泪狂刷Golang基础面试118题

在方法的定义中,被称为接收者(Receiver)。接收者是一个与方法绑定的特定类型的变量。这意味着该方法只能通过这种特定类型的变量来调用。在这个例子中,是一个函数类型,而run方法是绑定到这个类型的。

2401_84925152的博客 406

xilinx原语及bank简介

图8是HP bank与HR bank的IO模块,其中PAD是FPGA的金属管脚,IOB是输入、输出引脚的控制模块。此时使用原语就可以只调用需要的组件,不需要去考虑其余组件参数设置,就方便很多,借助此次机会就对IDDR、ODDR、IDELAYE2、ODELAYE2、IDELAYCRTL、ISERDESE、OSERDESE等几个原语做了简要了解,并对原语的各个模式进行了仿真,本文最初是介绍IDDR的,但在介绍IDDR这些原语之前,还需要了解一下7系列FPGA bank的分类和区别,所以就有了本文。

qq_43416206的博客 415

vue - 网站接入微信扫码登录功能详细教程,完整详细流程及完整功能示例源代码(附常见问题的解决方案与二维码样式修改方案)

vue.js项目植入微信登录,vue网页项目怎么做微信扫码登录,VUE项目中的微信扫码登录,VUE中最简单的js调用微信扫一扫功能,vue:如何设计网页的微信扫码登录功能,微信扫码功能官方文档,通过vue方式实现二维码扫码功能,vue调用微信扫码,vue H5 调用微信扫描二维码,Vue前端实现微信扫码登录,vue-wxlogin 微信授权登录组件,网站引入的微信登录框如何修改宽高或其他样式,wxlogin 组件插件怎么改变宽高,vue-wxlogin组件怎么自定义样式,微信网页授权,vue调用微信JSDK

✅ 精选推荐文章 6367

05 Go 语言中的函数和方法到底有什么不同

在 Go 语言中,虽然存在函数和方法两个概念,但是它们基本相同,不同的是所属的对象。函数属于一个包,方法属于一个类型,所以方法也可以简单地理解为和一个类型关联的函数。不管是函数还是方法,它们都是代码复用的第一步,也是代码职责分离的基础。掌握好函数和方法,可以让你写出职责清晰、任务明确、可复用的代码,提高开发效率、降低 Bug 率。本节课给你留的思考题是:方法是否可以作为表达式赋值给一个变量?如果可以的话,如何通过这个变量调用方法?

周壮的博客 1586

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

go语言解析php,详解 Go 语言中的方法

下面由Golang教程栏目给大家介绍Go语言中的方法,希望对需要的朋友有所帮助!go 方法定义方法是具有特殊接收器参数的函数,即在 func 和方法名之间方法接收者。func (s Student) GetName() string {return s.name}func (s *Student) SetName(name string) {s.name = name}我们可以把接收者类型为指针...

weixin_32075745的博客 324

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

理解Go语言中的方法和接收者

0x01 前言 Go语言的语法实在有些不一样,与其他面向对象语言相比,Go的方法似乎有些晦涩。 0x02 方法的定义 在Go语言里,方法和函数只差了一个,那就是方法在func和标识符之间多了一个参数。 type user struct { name string, email string, } //这里是函数的定义 func notify(email string) { fmt.Println("Email is %s", email) } //这里是方法的定义 fu

zhangge3663的博客 718

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

理解 Go 语言中的方法和接收者

0x01 前言 Go 语言的语法实在有些不一样,与其它面向对象语言相比,Go 的方法似乎有些晦涩。 0x02 方法的定义 在 Go 语言里,方法和函数只差了一个,那就是方法在 func 和标识符之间多了一个参数。 type user struct { name string, email string, } //这是函数的定义 func notify(emai...

qq_34709713的博客 207

通关GO语言05 函数和方法:Go 语言中的函数和方法到底有什么不同?

在 Go 语言中,虽然存在函数和方法两个概念,但是它们基本相同,不同的是所属的对象。函数属于一个包,方法属于一个类型,所以方法也可以简单地理解为和一个类型关联的函数。不管是函数还是方法,它们都是代码复用的第一步,也是代码职责分离的基础。掌握好函数和方法,可以让你写出职责清晰、任务明确、可复用的代码,提高开发效率、降低 Bug 率。本节课给你留的思考题是:方法是否可以作为表达式赋值给一个变量?如果可以的话,如何通过这个变量调用方法?

fegus的博客 599

Go语言中的接口方法:抽象方法的替代方案

在Go中,接口是一种类型,用于定义一组方法签名。任何实现了这些方法的类型都可以作为该接口类型的实例。一旦某个结构体实现了这个接口的所有方法,我们就可以说该结构体满足这个接口。在Go语言中,接口方法扮演了类似于抽象方法的角色。通过对接口和抽象方法的深入比较,我们可以得出结论:在Go语言环境中,接口确实可以作为抽象方法的有效替代方案。希望这篇文章能够解答你关于Go语言中接口方法和抽象方法之间关系的疑惑,并为你的软件设计和开发提供有用的参考。如有更多问题或想法,欢迎留言。

十年运维开发经验的王义杰在此分享自己的知识和经验 326

Go语言中的方法

1.1 方法声明 方法的声明和普通函数类似,只是在函数名字前面多了一个参数。这个参数把这个方法绑定到这个参数对应的类型上 import ( "fmt" ) type Point struct { x, y int } func fun() { fmt.Println("我是一个普通的 fun") } func (p Point) f

weiaiyisheng_ljj的博客 281

Go语言中的方法:深入理解接收者

在方法的定义中,被称为接收者(Receiver)。接收者是一个与方法绑定的特定类型的变量。这意味着该方法只能通过这种特定类型的变量来调用。func (f HandlerFunc) run(i string) { // 方法体 }在这个例子中,是一个函数类型,而run方法是绑定到这个类型的。

十年运维开发经验的王义杰在此分享自己的知识和经验 1248

3.1 Go语言中的函数与方法

本节开始讲介绍Go语言函数的使用方法,本节主要讲述基本使用方法。

老孙正经胡说 564

Go语言中的接口方法:抽象方法的替代方案_go 不支持抽象类型(2)

从以上讨论可以看出,虽然Go语言没有明确的抽象方法,但其接口方法确实提供了一种替代方案。它允许我们定义一组需要被实现的方法,同时也提供了多态性。因此,在Go语言的上下文中,接口方法可以被视为抽象方法的一种替代。论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!一旦某个结构体实现了这个接口的所有方法,我们就可以说该结构体满足这个接口。

2401_84265802的博客 371

Go语言中的方法集(methodset)是如何确定的?

在Go语言中,接口是一种类型,它定义了一组方法,但是这些方法的具体实现是由实现了该接口的具体类型提供的。在这个例子中,我们定义了一个名为Animal的接口类型,它有一个名为Speak的方法。在main函数中,我们使用Animal类型的变量来调用Speak方法,根据具体类型的方法实现,输出不同的结果。在main函数中,我们使用Number类型的变量来调用Add方法,根据具体类型的方法实现,输出不同的结果。总之,Go语言中的方法集是通过一系列规则来确定的,这些规则涉及到了各种类型的组合和方法的实现。

发现生活,分享智慧,一起成长! 570

05 函数和方法:Go 语言中的函数和方法到底有什么不同?

摘要:本文介绍了Go语言中的函数和方法。函数由func关键字、函数名、参数、返回值和函数体构成,支持多值返回、命名返回参数和可变参数。方法则与类型绑定,需指定接收者(值或指针类型)。两者都能实现代码复用,区别在于函数属于包,方法属于类型。文章还演示了匿名函数和闭包的使用,并指出Go语言会自动处理值/指针接收者的转换。最后思考题探讨方法作为表达式赋值给变量的可能性。

AatZai的博客 1963

go语言中的函数和方法

• 无需声明原型。• 支持不定 变参。• 支持多返回值。• 支持命名返回参数。• 支持匿名函数和闭包。• 函数也是一种类型,一个函数可以赋值给变量。• 不支持 嵌套 (nested) 一个包不能有两个名字一样的函数。• 不支持 重载 (overload)• 不支持 默认参数 (default parameter)。Golang 方法总是绑定对象实例,并隐式将实例作为第一实参 (receiver)。• 只能为当前包内命名类型定义方法。• 参数 receiver 可任意命名。

nbv12589的博客 1824
上一篇: go语言并发编程
下一篇: go语言中的接口
过去日记
过去日记 新星创作者: 后端开发技术领域 新星创作者: 后端开发技术领域
博客等级 码龄3年 5343粉丝 225原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

过去日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值