我们在C语言中,struct中声明函数,而Go中则不能再struct中声明函数。而是采用另外一种形态存在,Go中叫method。

method的概念

method是附属在一个给定的类型上,语法和函数的声明语法几乎一样,只是再func后面增加了一个recevier(也就是method所依从的主体)

method的语法格式

func (r ReceiverType) funcName(parameters) (results)
  • 1

形象一点说,就是 ReceiverType 类型的所有字段,方法 funcName 都是可以使用的,可以认为 funcName 属于 ReceiverType。

method简单应用

package mainimport ("fmt""math"
)type Rectangle struct {width, height float64
}
type Circle struct {radius float64
}func (r Rectangle) area() float64 {return r.width * r.height
}
func (c Circle) area() float64 {return c.radius * c.radius * math.Pi } func main() { r1 := Rectangle{12, 2} r2 := Rectangle{9, 4} c1 := Circle{10} c2 := Circle{25} fmt.Println("Area of r1 is: ", r1.area()) fmt.Println("Area of r2 is: ", r2.area()) fmt.Println("Area of c1 is: ", c1.area()) fmt.Println("Area of c2 is: ", c2.area()) } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

输出:

Areaof r1 is:  24
Area of r2 is: 36 Area of c1 is: 314.1592653589793 Area of c2 is: 1963.4954084936207
  • 1
  • 2
  • 3
  • 4

Rect 和 Circle 以及附属在他们身上的 area() 方法关系如下图所示:

  • method 是通过 . 来访问,就像访问struct里面字段一样。
  • method 里面可以访问接受者的字段,比如 r1.area() 就可以访问 r1 里面的 width 和 height。
  • 虽然 method 的名字是一样的,但是不同的 receiver 不一样,那么 method 就不一样。这一点很重要哦。
  • 还有一点,method不仅能作用再struct上,也可以定义再任何自定义的类型、内置类型等各种类型上面
  • method 中的 receiver 可以是值传递,也可以是指针。指针的话,就可以直接修改 receiver 中的内容

method的指针用法

格式:

func (r *ReceiverType) funcName(parameters) (results)
  • 1

看例子:

package mainimport "fmt"type person struct { name string age int32 } func (p *person) setPerson(name string, age int32) { p.name = name p.age = age } func main() { p := new(person) p.setPerson("uu_dou", 15) fmt.Println(p.name) fmt.Println(p.age) }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

输出:

uu_dou
15
  • 1
  • 2

如果上例中的 receiver 不是指针,则输出:

//name什么都没有
0 //age 默认为0
  • 1
  • 2

对比前面一个例子,不难发现不管 method 中的 receiver 是值传递,还是指针,都是通过 . 符号访问,因为 Go 知道 receiver 是不是指针。

method继承和重写

继承:如果 struct 中的一个匿名段实现了一个 method,那么包含这个匿名段的 struct 也能调用该 method。 
重写:如果 struct 中的一个匿名段实现了一个 method,包含这个匿名段的 struct 是可以重写匿名字段的方法的。

总结

method的相关知识是Go实现面向对象的重要基础,掌握它很重要。它与 java、c++ 不一样,没有任何的 private、public等关键词,依然通过大小写来实现(大写开头的为共有,小写开头的为私有),方法也同样适用这个原则。

Go语言基础:method相关推荐

  1. Java核心技术笔记 语言基础

    <Java核心技术 卷Ⅰ> 第3章 Java 的基本程序设计结构 一些规则 类命名:CamelCase 驼峰命名法,以及必须是字母开头,后面跟字母和数字的任意组合: 源代码文件名:必须与公 ...

  2. c语言基础学python_D11——C语言基础学PYTHON

    C语言基础学习PYTHON--基础学习D11 20180908内容纲要: 1.RabbitMQ消息队列 (1)RabbitMQ安装 (2)Rabbits示例 模式一:fanout 模式二:direct ...

  3. R语言基础数据操作fBasics

    R语言基础数据操作&fBasics xlsx文件的导入 library(readxl) data1 <- read_excel("C:/Users/12241/Desktop/ ...

  4. Gradle | Gradle构建之Groovy语言基础

    前言 Gradle的构建脚本是采用Groovy语言编写的.Groovy是Java平台上设计的一种强大的.可选类型和动态的语言.Groovy可以无缝地集成任何Java程序,并立即让你的应用程序拥有强大的 ...

  5. Java回炉之语言基础

    Java回炉之语言基础 Java回炉之语言基础 DOS命令 java编译过程 path和classpath的区别 关键字表 数据类型 位运算 算数优先级 内存划分 类的初始化过程 static关键字特 ...

  6. r语言各形状编号_190+张图片!吐血整理!搞定R语言基础绘图全部知识点

    转自:生信宝典|Bio_Data,不一样的生信学习平台 原文链接:ggplot2高效实用指南 (可视化脚本.工具.套路.配色) 作者:严涛 浙江大学作物遗传育种在读研究生(生物信息学方向)伪码农,R语 ...

  7. R语言基础统计分析:正态性检验、方差齐性检验、T检验、方差分析、秩和检验

    R语言基础统计分析 1. 正态性检验 1.1 Shapiro-Wilk正态检验方法 1.2 QQ图 2. 方差齐性检验 2.1 Bartlett检验,适用于正态分布数据 2.2 Levene检验,非正 ...

  8. WML语言基础-WML语言基础(WAP建站)

    WML语言基础-WML语言基础(WAP建站)一 作者:青燕    来源:青燕网    更新时间:2007-8-19 19:22:22    浏览次数:255 完成wap服务器的建立和wap浏览器的安装 ...

  9. Java基础知识——Java语言基础

    ---------------------- ASP.Net+Android+IO开发S. .Net培训.期待与您交流! ---------------------- 2.Java语言基础 Java语 ...

  10. Java--Java语言基础

    Java第一阶段学习 Java语言基础 流程控制 结束 Java语言基础 数据类型: byte short int long float double boolean char 其中浮点型即我们平时用 ...

最新文章

  1. vue vue-cli3 修改elementui的date-picker源码 引入node_modules里的element-ui后报错exports is not defined...
  2. java并发:简单面试问题集锦
  3. Thinkphp整合各个功能
  4. bigquery sql 正则表达式
  5. Eclipse中怎样安装数据库建模工具ERMaster插件
  6. Python中的time、datetime、calendar模块(时间模块)
  7. oracle用户权限的管理
  8. @scheduled注解配置时间_Java开发重写Spring Boot定时任务,支持可动态调整执行时间...
  9. 树状数组相关应用之逆序对问题
  10. iPhone11 全线降价;哈啰出行否认大量裁员;LineageOS 17.1 发布| 极客头条
  11. Sudo bug 可导致非权限 Linux 和 MacOS 用户以根身份运行命令
  12. 数据之路 - Python爬虫 - Requests库
  13. 开发自己的工作流(一)
  14. 计算机ip保留地址,分类ip地址中,保留地址有哪些?具体点说说,作业。
  15. 清理C盘空间,给Win7释放更多C盘容量
  16. 微软王码五笔86版 for win95/98/me 官网
  17. 安卓测试常用的 ADB 命令大全,非常全!!!!!
  18. dms mysql 工具_数据库管理工具DMS
  19. KBL410-ASEMI适配高端电源整流桥
  20. VMware vCenter突然无法正常登陆,出现[503 Service Unavailable]

热门文章

  1. Qt Creator使用帮助模式
  2. C++字节序反转的实现算法(附完整源码)
  3. C++在不使用任何算术运算符的情况下将两个数字相加(附完整源码)
  4. OpenGL indexedCube索引多维数据集的实例
  5. python数据类型详解(转自:http://www.cnblogs.com/linjiqin/p/3608541.html)
  6. Maven2的配置文件settings.xml
  7. CSS控制所有浏览器水平居中和控制链接不换行的效果
  8. SQL Server通过动态视图里查找阻塞超过30秒的会话
  9. Python对图像的基本操作
  10. Caffe: Faster-RCNN Python版本配置 (Windows)