go语言可以给任意类型定义方法,我在学习过程中,一开始一头雾水,但是随着理解的深入,现在也大概知道了什么叫做方法

之前的一些例子其实讲的并不是特别生动,下面我用一个生动的例子演示一下

首先提出需求。我做了一个自动门铃,当有人过来时候,机器人会自动报告,报告内容是谁来了,是干什么的,然后当他离开时候,又会报告这个干什么的叫什么的人走了

先上代码:

package main

import "fmt"

type person struct {
name, job string
} func (p person) come() {
fmt.Printf("有人来了,他叫做%s, 他的工作是%s\n", p.name, p.job)
} func (p person) leave() {
fmt.Printf("那个工作是%s的并且叫%s的人走了\n", p.job, p.name)
} func main() {
p := person{"小明", "快递"}
p.come()
p.leave()
}

  

运行结果如下:

有人来了,他叫做小明, 他的工作是快递
那个工作是快递的并且叫小明的人走了

  

下面我来说说使用go语言的方法的思路。我们还是按照以上代码示例来说。首先按照本例子的需求,我们要有以下步骤,首先要定义一个人,这个人有两个属性,就是名字和工作。然后定义了两个方法,一个是来,一个是离开。方法的作用,当然就是机器人报告来者是谁,离开者是谁。这些都是按照我们人脑的思维定义出来的。

那么按照go语言的思维如何定义呢。在本例子中,首先定义人的时候,因为有两个属性,所以要用结构体struct,然后有两个属性,一个是name,一个是job。然后为结构体定义了两个方法,一个是来时报告,一个是离开时报告。最后小明来了,我们实例化了结构体,让小明具体化以后,调用了两个方法,就完成了。整个流程很简单吧。

其实,在本例子中,结构体就是一个物体,方法就是给这个物体一个行为。特别像名词和动词的组合。例如,“我来了”,“小王在吃饭”,“门开了”。方法本质上就是这样。

上面,我一直强调在本例中,定义人的时候用的结构体,这是因为小明是有名字和工作两个属性,但是实际上,可以为任意类型定义方法的,下面我用另一个例子来说明,就用“门开了”来举例,代码如下:

package main

import "fmt"

type door string

func (d door) open() {
fmt.Println("the door is open")
} func main() {
// newdoor := door 注意这里,当用这种方式赋值时候会报错,提示type door不是一个声明,必须用下面那种方式定义赋值
var newdoor door
newdoor.open()
}

  

运行结果为:

the door is open

上面的例子中,我们定义了一个门,然后给了门一个“门开了”的动作,就这么简单一个方法。但是有人会问,为什么一定要加上var newdoor door这一句,多此一举,而不直接用door.open()调用呢。这是因为,用door.open()会报错,提示没有足够的参数。但是实际上,是因为我们开始只是抽象的定义了door这个东西,并没有对door实例化。

以上就是方法的作用,当然方法还有许多其他的作用。例如接口等,这些我们以后再讲。

最新文章

  1. hadoop2的思想架构
  2. Android ant自动打包脚本:自动替换友盟渠道、版本号、包名
  3. java io (一)
  4. css与js后边有?v=20160101
  5. UBI系统原理分析【转】
  6. 原创开源项目HierarchyViewer for iOS 2.1 Beta新功能介绍
  7. vim 多窗口
  8. MS SQL SERVER 中的系统表
  9. Linux 下实现控制屏幕显示信息和光标的状态
  10. django安装
  11. 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context}
  12. ENode框架Conference案例转载
  13. javaWeb学习总结(4)- HTML 关于head中的<meta>标签
  14. 【17-06-19】Java进阶自测:面向对象基础知识掌握了吗?(附答案及个人解析)
  15. 其他综合-内网下Yum仓库搭建配置
  16. [转]理解下DMA/NorFlash/DDR下的Burst是个什么概念
  17. OO第一次课程总结分析
  18. macOS Sierra 如何打开任何来源
  19. linux内核分析第三周
  20. java二叉树排序实现

热门文章

  1. Python pip 国内镜像大全及使用办法
  2. linux专题(九):磁盘管理
  3. Python之爬虫(十七) Scrapy框架中Spiders用法
  4. Django框架11 /form组件、modelForm组件
  5. softmax、cross entropy和softmax loss学习笔记
  6. keyring源码加密解密函数分析
  7. 对掌机游戏Pokemon的一部分系统的拆解流程图
  8. bzoj2295【POJ Challenge】我爱你啊*
  9. .NET 开源项目 StreamJsonRpc 介绍[下篇]
  10. java面试题jvm字节码的加载与卸载