最近在系统的学习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的更多相关文章

  1. Ubuntu14.04+RabbitMQ3.6.3+Golang的最佳实践

    目录 [TOC] 1.RabbitMQ介绍 1.1.什么是RabbitMQ?   RabbitMQ 是由 LShift 提供的一个 Advanced Message Queuing Protocol ...

  2. Golang - 爬虫案例实践

    目录 Golang - 爬虫案例实践 1. 爬虫步骤 2. 正则表达式 3. 并发爬取美图 Golang - 爬虫案例实践 1. 爬虫步骤 明确目标(确定在哪个网址搜索) 爬(爬下数据) 取(去掉没用 ...

  3. golang之面向对象编程

    1.Golang语言面向对象编程说明 1)Golang也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言.所以我们说Golang支持面向对象编程特性是比较准确的. ...

  4. C++面向对象实践

    实践如下: class Person{ private: int age; ]; int hight; public: Person(int age, int hight, char* name); ...

  5. 【Go入门教程5】面向对象(method、指针作为receiver、method继承、method重写)

    前面两章我们介绍了函数和struct,那你是否想过函数当作struct的字段一样来处理呢?今天我们就讲解一下函数的另一种形态,带有接收者(receiver)的函数,我们称为method method ...

  6. 【Go入门教程7】面向对象(method、指针作为receiver、method继承、method重写)

    前面两章我们介绍了函数和struct,那你是否想过函数当作struct的字段一样来处理呢?今天我们就讲解一下函数的另一种形态,带有接收者(receiver)的函数,我们称为method method ...

  7. golang OOP面向对象

    摘自:http://www.01happy.com/golang-oop/ golang中并没有明确的面向对象的说法,实在要扯上的话,可以将struct比作其它语言中的class. 类声明 1 2 3 ...

  8. Golang中类面向对象特性

    一.类型方法的实例成员复制与类型方法的实例成员引用   在Go中可以类似Java等面向对象语言一定为某个对象定义方法,但是Go中并没有类的存在,可以不严格的将Go中的struct类型理解为面向对象中的 ...

  9. Golang微服务实践

    背景 在之前的文章<漫谈微服务>我已经简单的介绍过微服务,微服务特性是轻量级跨平台和跨语言的服务,也列举了比较了集中微服务通信的手段的利弊,本文将通过RPC通信的方式实现一个增删查Redi ...

随机推荐

  1. ASP.Net Web API 输出缓存 转载 -- Output caching in ASP.NET Web API

    一.Nuget安装相关dll Web API 2 : Install-Package Strathweb.CacheOutput.WebApi2 Web API 1 : Install-Package ...

  2. pgsql SQL复杂查询示例

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code   WITH tmp AS(SELECT sum(sessioncount) as v ...

  3. (二 -5) 天猫精灵接入Home Assistant-自动发现Mqtt设备--电风扇

    官网:https://www.home-assistant.io/components/fan.mqtt/ 1 添加配置文件 要在安装中启用MQTT风扇,请将以下内容添加到您的configuratio ...

  4. >/dev/null 2>&1和2>&1 >/dev/null区别

    >/dev/null 2>&1和2>&1 >/dev/null区别 >/dev/null 2>&1 //会将标准输出,错误输出都重定向至/d ...

  5. docker 4 docker的三要素

    docker三要素 镜像,容器,仓库 镜像 docker镜像(image)就是一个只读的模板,镜像可以用来创建docker容器,一个镜像可以创建很多个容器 容器 docker利用容器(containe ...

  6. Egg入门学习(三)---理解中间件作用

    Egg是基于koa的,因此Egg的中间件和Koa的中间件是类似的.都是基于洋葱圈模型的. 在Egg中,比如我想禁用某些IP地址来访问我们的网页的时候,在egg.js中我们可以使用中间件来实现这个功能, ...

  7. face detection[SSH]

    该文来自<SSH: Single Stage Headless Face Detector>,本文时间线2017年8月. 不同于face rcnn那种两阶段的方法,SSH和ssd一样是一阶 ...

  8. 如何备份和恢复你的TFS服务器(一)

    备份和恢复一个TFS(Team Foundation Server)服务器常常令人心生畏惧.因为这会涉及到很多服务和步骤.TFS(Team Foundation Server)2010一发布,我就知道 ...

  9. Elasticsearch 思维导图集锦(持续更新...)

    目录 引言 思维导图 全文搜索 Elastic 基础 Query DSL Multi Match Query 系列文章列表 参考 引言 本文主要是对 elasticsearch 的一些知识点使用思维导 ...

  10. Javascript设计模式之我见:观察者模式

    大家好!本文介绍观察者模式及其在Javascript中的应用. 模式介绍 定义 定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新. 类图及说明 S ...