004_自己尝试go语言中的方法
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实例化。
以上就是方法的作用,当然方法还有许多其他的作用。例如接口等,这些我们以后再讲。
004_自己尝试go语言中的方法的更多相关文章
- Go 语言中的方法,接口和嵌入类型
https://studygolang.com/articles/1113 概述 在 Go 语言中,如果一个结构体和一个嵌入字段同时实现了相同的接口会发生什么呢?我们猜一下,可能有两个问题: 编译器会 ...
- 019_go语言中的方法
代码演示 package main import "fmt" type rect struct { width, heigh int } func (r *rect) area() ...
- Go语言中的方法和函数
在C#或者Java里面我们都知道,一个Class是要包含成员变量和方法的,对于GO语言的Struct也一样,我们也可以给Struct定义一系列方法. 一.怎么定义一个方法? Go的方法是在函数前面加上 ...
- go语言中的方法method
package main; import "fmt" //重新定义一个类型 //为该INT类型扩展方法 type INT int; type A struct { name str ...
- ————————C语言中快速排序方法——————————————
在对浮点型排序是一定要用三木运算符(三目运算符内容下去自己看),因为如果也是用整形那样的减法的时候如果是两个十分相近的数字 可能返回一个小数(自己一会去试试),冉冉他cmp返回值是int(试试别的)因 ...
- GO语言中的几个关键思想
GO语言的设计理念与C++,Java,Python之流大相径庭. 一.没有函数重载 GO语言里面没有函数重载,Java.C#.C++三位大牛都是支持函数重载的,Python虽然不支持函数重载,但是支持 ...
- Go语言 - 结构体 | 方法
自定义类型和类型别名 自定义类型 在Go语言中有一些基本的数据类型,如string.整型.浮点型.布尔等数据类型, Go语言中可以使用type关键字来定义自定义类型. 自定义类型是定义了一个全新的类型 ...
- 在易语言中调用MS SQL SERVER数据库存储过程方法总结
Microsoft SQL SERVER 数据库存储过程,根据其输入输出数据,笼统的可以分为以下几种情况或其组合:无输入,有一个或多个输入参数,无输出,直接返回(return)一个值,通过output ...
- C语言中返回字符串函数的四种实现方法 2015-05-17 15:00 23人阅读 评论(0) 收藏
C语言中返回字符串函数的四种实现方法 分类: UNIX/LINUX C/C++ 2010-12-29 02:54 11954人阅读 评论(1) 收藏 举报 语言func存储 有四种方式: 1.使用堆空 ...
随机推荐
- 如何让touchmove之后不触发touchend的事件
手机扫码看效果 不多说,直接上代码 <ul id="Ul"> <li>111</li> <li>222</li> < ...
- msyql事务的四种隔离级别
一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有 ...
- java 面向对象(三十二):泛型一 泛型的理解
1.泛型的概念所谓泛型,就是允许在定义类.接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型.这个类型参数将在使用时(例如,继承或实现这个接口,用这个类型声明变量.创建对象时确定 ...
- 数据可视化之powerBI技巧(二十一)简单三个步骤,轻松管理你的Power BI度量值
最近碰到几个星友的问题,都是问我之前分享的源文件是如何把度量值分门别类放到不同的文件夹中的,就像这样, 其实在之前的文章中也曾提及过做法,这里再详细说一下制作步骤: 01 | 新建一个空表 点击菜单栏 ...
- bzoj3196Tyvj1730二逼平衡树
bzoj3196Tyvj1730二逼平衡树 题意: 维护一个数列,操作:查询k在区间内的排名.查询区间内排名为k的值3.修改某一位上的数值.查询k在区间内的前驱(前驱定义为小于x,且最大的数).查询k ...
- Ethical Hacking - NETWORK PENETRATION TESTING(12)
Post Connection Attacks Sophisticated attacks that can be used after connecting to the target AP. Ga ...
- Vue开发者必会的基础知识盘点
你会Vue吗,你看以下知识点你掌握了多少?实际工作中是否运用的得心应手?如果是,那么恭喜你! Vue中的数据和DOM已经被关联起来,所有的东西都是响应式的.注意我们不再和HTML直接交互.一个Vue应 ...
- K8s-Pod健康检查原理与实践
Pod健康检查介绍 默认情况下,kubelet根据容器运行状态作为健康依据,不能监视容器中应用程序状态,例如程序假死.这将会导致无法提供服务,丢失流量.因此重新健康检查机制确保容器健康幸存.Pod通过 ...
- 【Nginx】如何使用Nginx实现MySQL数据库的负载均衡?看完我懂了!!
写在前面 Nginx能够实现HTTP.HTTPS协议的负载均衡,也能够实现TCP协议的负载均衡.那么,问题来了,可不可以通过Nginx实现MySQL数据库的负载均衡呢?答案是:可以.接下来,就让我们一 ...
- JAVA集合二:HashMap和Hashtable
参考链接: HOW2J.CN HashMap HashMap实现了JAVA的Map接口,类似于C++的STL框架的Map,是存储键值对的数据结构.键(key)是唯一的,但值(value)可以重复,如果 ...