Golang的面向对象实践method
最近在系统的学习go的语法,一切都弄好了之后准备弄个im项目出来玩。在这个过程中会把看到有趣的写法和语法啥的拿出来分析一下。
我一直以为go语言对面向对象没有支持,但是后面看到了类似类的概念,method特性以及其接受参数的reciver。
使用method就可以将不同的函数和结构体联系起来。
其实我现在还是习惯把go里面申明的结构体想象成对象,因为感觉很像,就像python里面你申明了一个对象,他有各种各样的属性一样。要介绍method和reciver来看个例子:
package main
import "fmt"
type Rectangle struct {
width, height float64
}
func area(r Rectangle) float64 {
return r.width * r.height
}
func main() {
r1 := Rectangle{12 , 2}
r2 := Rectangle{9, 4}
fmt.Println("Area of r1 is: ", area(r1))
fmt.Println("area of r2 is: ", area(r2))
}
这个例子就是我们定义了一个Rectangle的结构体,他有两个float64的属性width 和 height。
现在我们定义一个area函数,注意这里这个area函数跟其他的函数没有任何关系,就是接受接收一个rectangle结构体作为参数,然后返回计算了面积。
有点面向对象经验的同学,现在肯定就在想了,感觉这个计算Rectangle面积其实应该是Rectangle这个类中的一个函数,调用这个类函数就可以计算长方形的面积。
是的,所以我们可以使用method将这个结构体和这个函数关联起来,来看下面的代码:
package main
import "fmt"
type Rectangle struct {
width, height float64
}
func (r Rectangle) area() float64 {
return r.width * r.height
}
func main() {
r1 := Rectangle{12 , 2}
r2 := Rectangle{9, 4}
fmt.Println("Area of r1 is: ", r1.area())
fmt.Println("area of r2 is: ", r2.area())
}
这里我们用method来实现了为Rectangle计算面积这件事情。这里我们指定reciver 是 Rectangle 可以注意到,最后我们在申明area这个函数的时候,已经不需要再传入参数了,可以直接从reciver接收的结构体进行获取。这个地方会感觉这里传入的结构体这里,有点像传入了一个self字段,然后我们拿着这个self字段像去python 函数里面获取对象本身的值即一个函数,去调用各种属性和参数。
另外method还支持继承和重写,行为都和python中类继承很像这里我再举一个例子:
package main
import "fmt"
type Human struct {
name string
age int
phone string
}
type Student struct {
Human
school string
loan float32
}
type Employee struct {
Human
company string
money float32
}
//Human 对象实现Sayhi方法
func (h *Human) SayHi() {
fmt.Printf("Hi, I am %s you can call me on %s\n", h.name, h.phone)
}
//Human 对象实现Sing方法
func (h *Human) Sing(lyrics string) {
fmt.Println("La la, la la la, la la la ...", lyrics)
}
func (h *Human) Guzzle(beerStein string) {
fmt.Println("Guzzle Guzzle Guzzle...", beerStein)
}
func (e *Employee) SayHi() {
fmt.Printf("Hi, I am %s, I work at %s. Call me on %s\n", e.name, e.company, e.phone)
}
func main() {
o := Employee{Human: Human{name: "piperck", age: 25, phone: ""}, company: "xcf", money: 100}
o.Guzzle("XIBA")
o.Sing("what what you say what")
}
可以注意到,在结构体里,使用匿名结构体包含了一下Employee ,然后申明了一个结构体Employee实例o就可以使用Human上的方法了,并且继承了这些方法。
总之感觉就和类中定义函数,类的继承一个感觉。当结构体中存在继承,那么被继承的结构体添加了method,继承的结构体也同时拥有了该method,并且也可以进行重写,覆盖父类method。
Reference:
Go Web编程-谢孟军
Golang的面向对象实践method的更多相关文章
- Ubuntu14.04+RabbitMQ3.6.3+Golang的最佳实践
目录 [TOC] 1.RabbitMQ介绍 1.1.什么是RabbitMQ? RabbitMQ 是由 LShift 提供的一个 Advanced Message Queuing Protocol ...
- Golang - 爬虫案例实践
目录 Golang - 爬虫案例实践 1. 爬虫步骤 2. 正则表达式 3. 并发爬取美图 Golang - 爬虫案例实践 1. 爬虫步骤 明确目标(确定在哪个网址搜索) 爬(爬下数据) 取(去掉没用 ...
- golang之面向对象编程
1.Golang语言面向对象编程说明 1)Golang也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言.所以我们说Golang支持面向对象编程特性是比较准确的. ...
- C++面向对象实践
实践如下: class Person{ private: int age; ]; int hight; public: Person(int age, int hight, char* name); ...
- 【Go入门教程5】面向对象(method、指针作为receiver、method继承、method重写)
前面两章我们介绍了函数和struct,那你是否想过函数当作struct的字段一样来处理呢?今天我们就讲解一下函数的另一种形态,带有接收者(receiver)的函数,我们称为method method ...
- 【Go入门教程7】面向对象(method、指针作为receiver、method继承、method重写)
前面两章我们介绍了函数和struct,那你是否想过函数当作struct的字段一样来处理呢?今天我们就讲解一下函数的另一种形态,带有接收者(receiver)的函数,我们称为method method ...
- golang OOP面向对象
摘自:http://www.01happy.com/golang-oop/ golang中并没有明确的面向对象的说法,实在要扯上的话,可以将struct比作其它语言中的class. 类声明 1 2 3 ...
- Golang中类面向对象特性
一.类型方法的实例成员复制与类型方法的实例成员引用 在Go中可以类似Java等面向对象语言一定为某个对象定义方法,但是Go中并没有类的存在,可以不严格的将Go中的struct类型理解为面向对象中的 ...
- Golang微服务实践
背景 在之前的文章<漫谈微服务>我已经简单的介绍过微服务,微服务特性是轻量级跨平台和跨语言的服务,也列举了比较了集中微服务通信的手段的利弊,本文将通过RPC通信的方式实现一个增删查Redi ...
随机推荐
- centos7下安装docker(16.docker跨主机存储)
从业务数据的角度看,容器可以分为两类:无状态(stateless)容器和有状态(stateful)容器. 无状态:是指容器在运行的过程中不需要保存数据,每次访问的结果不依赖上一次的访问,比如提供静态页 ...
- 当web应用包含了websocket长连接,如何在web应用前加一层nginx转发
1 通过在web应用的前面加一层nginx ,可以实现一台主机部署多个应用,每个应用都可以用不同的域名去访问,并且端口都是80 2 nignx 转发websocket长连接 1 每个web应用,他们运 ...
- Tmux的快捷键
Ctrl+b 激活控制台:此时以下按键生效 系统操作 ? 列出所有快捷键:按q返回 d 脱离当前会话:这样可以暂时返回Shell界面,输入tmux attach能够重新进入之前的会话 D 选择要脱离的 ...
- iterable与iterator
1.迭代器的感性认识 对于Collection类下的集合如各种List各种Set,用于实现这些集合的数据结构各不相同,比如数组实现的ArrayList.链表实现的LinkedList,当客户端知道要使 ...
- 【vue】vue中ref用法
1.获取当前元素: 例子: <div class="pop pos-a" :style="{ left: pop_x + 'px' ,top: pop_y + 'p ...
- 网站建设部署与发布--笔记3-部署Nginx
部署Nginx 操作系统CentOS 7.2 1.安装epel库 $ yum install epel-release -y 2.安装nginx $ yum -y install nginx 3.启动 ...
- Feature Extractor[batch normalization]
1 - 背景 摘要:因为随着前面层的参数的改变会导致后面层得到的输入数据的分布也会不断地改变,从而训练dnn变得麻烦.那么通过降低学习率和小心地参数初始化又会减慢训练过程,而且会使得具有饱和非线性模型 ...
- .NET Core Community 第四个千星项目诞生:微服务框架 Surging
本文所有打赏将全数捐赠于 NCC(NCC 的资金目前由 倾竹大人 负责管理),请注明捐赠于 NCC.捐赠情况将由倾竹大人在此处公示. 提及 .NET 微服务,我们脑海中浮现的一系列印象中,总有 Sur ...
- C++ string中的find()函数
1.string中find()返回值是字母在母串中的位置(下标记录),如果没有找到,那么会返回一个特别的标记npos.(返回值可以看成是一个int型的数) #include<cstring> ...
- c++入门之文件读取
再次强调这个观念:写文件,读文件和读,写控制台本质上没有区别,意识到这一点是十分重要的.下面给出读文件的代码: #include "iostream" # include &quo ...