Go语言基础:method
我们在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相关推荐
- Java核心技术笔记 语言基础
<Java核心技术 卷Ⅰ> 第3章 Java 的基本程序设计结构 一些规则 类命名:CamelCase 驼峰命名法,以及必须是字母开头,后面跟字母和数字的任意组合: 源代码文件名:必须与公 ...
- c语言基础学python_D11——C语言基础学PYTHON
C语言基础学习PYTHON--基础学习D11 20180908内容纲要: 1.RabbitMQ消息队列 (1)RabbitMQ安装 (2)Rabbits示例 模式一:fanout 模式二:direct ...
- R语言基础数据操作fBasics
R语言基础数据操作&fBasics xlsx文件的导入 library(readxl) data1 <- read_excel("C:/Users/12241/Desktop/ ...
- Gradle | Gradle构建之Groovy语言基础
前言 Gradle的构建脚本是采用Groovy语言编写的.Groovy是Java平台上设计的一种强大的.可选类型和动态的语言.Groovy可以无缝地集成任何Java程序,并立即让你的应用程序拥有强大的 ...
- Java回炉之语言基础
Java回炉之语言基础 Java回炉之语言基础 DOS命令 java编译过程 path和classpath的区别 关键字表 数据类型 位运算 算数优先级 内存划分 类的初始化过程 static关键字特 ...
- r语言各形状编号_190+张图片!吐血整理!搞定R语言基础绘图全部知识点
转自:生信宝典|Bio_Data,不一样的生信学习平台 原文链接:ggplot2高效实用指南 (可视化脚本.工具.套路.配色) 作者:严涛 浙江大学作物遗传育种在读研究生(生物信息学方向)伪码农,R语 ...
- R语言基础统计分析:正态性检验、方差齐性检验、T检验、方差分析、秩和检验
R语言基础统计分析 1. 正态性检验 1.1 Shapiro-Wilk正态检验方法 1.2 QQ图 2. 方差齐性检验 2.1 Bartlett检验,适用于正态分布数据 2.2 Levene检验,非正 ...
- WML语言基础-WML语言基础(WAP建站)
WML语言基础-WML语言基础(WAP建站)一 作者:青燕 来源:青燕网 更新时间:2007-8-19 19:22:22 浏览次数:255 完成wap服务器的建立和wap浏览器的安装 ...
- Java基础知识——Java语言基础
---------------------- ASP.Net+Android+IO开发S. .Net培训.期待与您交流! ---------------------- 2.Java语言基础 Java语 ...
- Java--Java语言基础
Java第一阶段学习 Java语言基础 流程控制 结束 Java语言基础 数据类型: byte short int long float double boolean char 其中浮点型即我们平时用 ...
最新文章
- vue vue-cli3 修改elementui的date-picker源码 引入node_modules里的element-ui后报错exports is not defined...
- java并发:简单面试问题集锦
- Thinkphp整合各个功能
- bigquery sql 正则表达式
- Eclipse中怎样安装数据库建模工具ERMaster插件
- Python中的time、datetime、calendar模块(时间模块)
- oracle用户权限的管理
- @scheduled注解配置时间_Java开发重写Spring Boot定时任务,支持可动态调整执行时间...
- 树状数组相关应用之逆序对问题
- iPhone11 全线降价;哈啰出行否认大量裁员;LineageOS 17.1 发布| 极客头条
- Sudo bug 可导致非权限 Linux 和 MacOS 用户以根身份运行命令
- 数据之路 - Python爬虫 - Requests库
- 开发自己的工作流(一)
- 计算机ip保留地址,分类ip地址中,保留地址有哪些?具体点说说,作业。
- 清理C盘空间,给Win7释放更多C盘容量
- 微软王码五笔86版 for win95/98/me 官网
- 安卓测试常用的 ADB 命令大全,非常全!!!!!
- dms mysql 工具_数据库管理工具DMS
- KBL410-ASEMI适配高端电源整流桥
- VMware vCenter突然无法正常登陆,出现[503 Service Unavailable]
热门文章
- Qt Creator使用帮助模式
- C++字节序反转的实现算法(附完整源码)
- C++在不使用任何算术运算符的情况下将两个数字相加(附完整源码)
- OpenGL indexedCube索引多维数据集的实例
- python数据类型详解(转自:http://www.cnblogs.com/linjiqin/p/3608541.html)
- Maven2的配置文件settings.xml
- CSS控制所有浏览器水平居中和控制链接不换行的效果
- SQL Server通过动态视图里查找阻塞超过30秒的会话
- Python对图像的基本操作
- Caffe: Faster-RCNN Python版本配置 (Windows)