- 前言
- Go 与操作系统
- Go 内部机制
- Go 基本数据类型
- 4 组合类型的使用
- 5 数据结构
- 6 Go package 中不为人知的知识
- 7 反射和接口
- 8 Go UNIX 系统编程
- 08.1 关于 UNIX 进程
- 08.2 flag 包
- 8.2 flag 包
- 08.3 io.Reader 和 io.Writer 接口
- 08.4 bufio 包
- 08.5 读取文本文件
- 08.6 从文件中读取所需的数据量
- 08.7 为什么我们使用二进制格式
- 08.8 读取 CSV 文件
- 08.9 写入文件
- 08.10 从磁盘加载和保存数据
- 08.11 再看strings包
- 08.12 关于bytes包
- 08.13 文件权限
- 08.14 处理 Unix 信号
- 08.15 Unix 管道编程
- 08.16 遍历目录树
- 08.17 使用 ePBF
- 08.18 关于 syscall.PtraceRegs
- 08.19 跟踪系统调用
- 08.20 User ID 和 group ID
- 08.21 其他资源
- 08.22 练习
- 08.23 总结
- 9 并发 Goroutines、Channel 和 Pipeline
- 10 Go 并发-进阶讨论
- 11 代码测试、优化及分析
- 12 Go 网络编程基础
- 13 网络编程 - 构建服务器与客户端
07.1 类型方法
Go的类型方法是带有特殊参数的函数。在一个声明为普通函数的方法函数名前面,增加一个特定参数,该特定参数将函数与该参数的类型进行关联,该特定参数被称为方法的接收器。
下面的Go代码是在https://golang.org/src/os/file_plan9.go中的 Close()
函数的实现:
> func (f *File) Close() error {
> if err := f.checkValid("close"); err != nil {
> return err
> }
> return f.file.close()
> }
Close()
函数就是类型方法,因为函数名称前面和 func
关键字后面有(f *File)
参数。 f```参数被称为**方法的接收器**;在面向对象编程术语中,这个过程可以描述为向**对象**发送消息。在Go语言中,**方法的接收器**是使用常规变量名定义的,通常使用单个字母,而不需要使用专用关键字,如
this``或
self` 。
接下来我们使用 methods.go
文件的Go代码来呈现一个完整的示例,包含以下四部分。
methods.go
的第一部分是以下Go代码:
> package main
>
> import (
> "fmt"
> )
>
> type twoInts struct {
> X int64
> Y int64
> }
在前面的代码中,定义了结构体 twoInts
,该结构体包含两个 int64
类型的字段。
methods.go
的第二个代码段如下:
> func regularFunction(a, b twoInts) twoInts {
> temp := twoInts{X: a.X + b.X, Y: a.Y + b.Y}
> return temp
> }
在本部分中,定义了一个名为 regularFunction()
的函数,该函数接收两个 twoInts
类型的参数,并返回一个 twoInts
类型的值。
methods.go
程序的第三部分包含以下Go代码:
> func (a twoInts) method(b twoInts) twoInts {
> temp := twoInts{X: a.X + b.X, Y: a.Y + b.Y}
> return temp
> }
method()
函数等效于 methods.go
前面部分定义的 regularFunction()
函数。 method()
函数是一个类型方法。接下来将介绍类型方法的调用与普通函数调用的差别。
这里真正有趣的是,类型方法
method()
与普通函数regularFunction()
的实现完全相同。
methods.go
的最后一个代码段如下:
> func main() {
> i := twoInts{X: 1, Y: 2}
> j := twoInts{X: -5, Y: -2}
> fmt.Println(regularFunction(i, j))
> fmt.Println(i.method(j))
> }
如您所见,您调用类型方法( i.method(j)
)的方式是与普通函数( regularFunction(i,j)
)的调用方式不同。
执行 methods.go
的输出如下:
> $ go run methods.go
> {-4 0}
> {-4 0}
值得注意的是,类型方法也与接口相关,下一节中将对接口进行讲解,稍后也将看到更多类型方法的使用。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论