Go学习笔记 - 关于Java、Python、Go编程思想的不同

看了两周七牛团队翻译的《Go语言程序设计》,基本上领略到了Go语言的魅力。学习一个语言,语法什么的任何人都是很容易学会,难就难在充分领略到这门编程语言的思想。

面向对象

喂!屌丝码农该找个对象了。

除去Java Python Go这三种语言底层以及语法的不同,这里以个人的理解只说说其面向对象方面的思想。 一个简单的示例:

描述人,李雷,韩梅梅,他俩都是好学生。

将用 java python go 这三种语言分别简单的描述。


Java 思想

人,是抽象的概念,可以洗衣做饭的灵长目物种,没法特指一样具体的东西,但它也有一些如性别、撒尿这类的属性和功能。

/**
* 抽象出来的人
*/
abstract class Human {
protected String sex;
protected String name; public void setSex(String sex) {
this.sex = sex;
} public String getSex() {
return this.sex;
} public void setName(String name) {
this.name = name;
} public String getName() {
return this.name;
} abstract void doPee(); // 抽象的方法
}

这里使用抽象类,是因为名字都是父母起的,但撒尿的方法男女不同。接下来是具象人这个抽象的概念了。这里就固话性别属性并且具体定义撒尿的方式。

/** * 具象的男性 */ class Male extends Human { public Male() { this.sex = "男"; }

    /**
* 实现的方法
*/
public void doPee() {
System.out.println(this.name + " " + this.sex + "站着撒尿.");
}
} /**
* 具象的女性
*/
class Female extends Human {
public Female() {
this.sex = "女";
} /**
* 实现的方法
*/
public void doPee() {
System.out.println(this.name + " " + this.sex + "蹲着撒尿.");
}
}

现在有男人和女人了,然后李磊和韩梅梅就要来折磨我们了

Male lilei = new Male();
lilei.setName("李磊");
System.out.println(lilei.getName() + " " + lilei.getSex() + " " + "出场"); Female hanmeimei = new Female();
hanmeimei.setName("韩梅梅");
System.out.println(hanmeimei.getName() + " " + hanmeimei.getSex() + " " + "出场"); lilei.doPee();
hanmeimei.doPee(); _________________________________________________
output: 李磊 男 出场
output: 韩梅梅 女 出场
output: 李磊 男站着撒尿.
output: 韩梅梅 女蹲着撒尿.

李磊和韩梅梅都是好学生,我们这里定义学习的接口,这里的接口就是,大家必须得死学傻学,怎么学看你自己。

/**
* 学习接口
*/
interface Study {
public abstract void learningEnglish();
}

上面是教育部规定的,李磊韩梅梅作为学生必须得学,男人女人都得经历的。来实现学习接口。

 class Male extends Human implements Study {
......
...... /**
* 实现的接口
*/
public void learningEnglish() {
System.out.println(this.name + ": How are you?");
}
} /**
* 具象的女性
*/
class Female extends Human implements Study {
......
...... /**
* 实现的接口
*/
public void learningEnglish() {
System.out.println(this.name + ": I'm fine, thank you!");
}
} ......
...... lilei.doPee();
hanmeimei.doPee(); lilei.learningEnglish();
hanmeimei.learningEnglish(); _________________________________________________
output: 李磊: How are you?
output: 韩梅梅: I'm fine, thank you!

java的思想大致就是这么样。很严谨,就像一个老学究,1就是1,2就是2。

这是所有的java代码

Main.java

public class Main {

    public static void main(String[] args) {

        Male lilei = new Male();
lilei.setName("李磊");
System.out.println(lilei.getName() + " " + lilei.getSex() + " " + "出场"); Female hanmeimei = new Female();
hanmeimei.setName("韩梅梅");
System.out.println(hanmeimei.getName() + " " + hanmeimei.getSex() + " " + "出场"); lilei.doPee();
hanmeimei.doPee(); lilei.learningEnglish();
hanmeimei.learningEnglish();
}
} /**
* 抽象出来的人
*/
abstract class Human {
protected String sex;
protected String name; public void setSex(String sex) {
this.sex = sex;
} public String getSex() {
return this.sex;
} public void setName(String name) {
this.name = name;
} public String getName() {
return this.name;
} abstract void doPee(); // 抽象的方法
} /**
* 学习接口
*/
interface Study {
public abstract void learningEnglish();
} /**
* 具象的男性
*/
class Male extends Human implements Study {
public Male() {
this.sex = "男";
} /**
* 实现的方法
*/
public void doPee() {
System.out.println(this.name + " " + this.sex + "站着撒尿.");
} /**
* 实现的接口
*/
public void learningEnglish() {
System.out.println(this.name + ": How are you?");
}
} /**
* 具象的女性
*/
class Female extends Human implements Study {
public Female() {
this.sex = "女";
} /**
* 实现的方法
*/
public void doPee() {
System.out.println(this.name + " " + this.sex + "蹲着撒尿.");
} /**
* 实现的接口
*/
public void learningEnglish() {
System.out.println(this.name + ": I'm fine, thank you!");
}
}

Python 思想

python无以言状的灵活,你就是上帝!

这里我们只要创建一个根类,其他的东西,随时随地,想加就加。

class Human:
"""

"""
def __init__(self):
self.__name = ""
self.__sex = "" def setName(self, name):
self.__name = name def getName(self):
return self.__name def setSex(self, sex):
self.__sex = sex def getSex(self):
return self.__sex name = property(getName, setName) # 就像java中的POJO setter以及getter
sex = property(getSex, setSex) # 就像java中的POJO setter以及getter

下面就边执行边丰满它

lilei = Human()
lilei.sex = "男"
lilei.name = "李磊"
print "%s %s 出场" % (lilei.name, lilei.sex) hanmeimei = Human()
hanmeimei.sex = "女"
hanmeimei.name = "韩梅梅"
print "%s %s 出场" % (hanmeimei.name, hanmeimei.sex) # Pee的方法
def doPee(self, how):
print "%s %s %s撒尿" % (self.name, self.sex, how) Human.doPee = doPee #动态绑定方法 lilei.doPee("站着")
hanmeimei.doPee("蹲着") # 学习的方法
def doLearning(self, learn):
print "%s: %s" % (self.name, learn) Human.doLearning = doLearning #动态绑定方法 lilei.doLearning("How are you?")
lilei.doLearning("I'm fine, thank you!") _________________________________________________
output: 李磊 男 出场
output: 李磊韩梅梅 女 出场
output: 李磊 男 站着撒尿
output: 韩梅梅 女 蹲着撒尿
output: 李磊: How are you?
output: 李磊: I'm fine, thank you!

python中一切对象都是鸭子类型,何谓鸭子类型?只要会"嘎嘎"叫的东西都是鸭子。应用到上面场景中,只要具有学习和撒尿方法的对象都可以看作人了。从另一方面说,我对于鸭子只关注它是否能够"嘎嘎"叫,如果能,不管是什么东西,那么它就是一只鸭子; 对于人,只关注他们是否能撒尿与学习,既能撒尿又能学习,他凭什么就不是人?

python和java就好像阴阳之替的东方玄学之余西方哲学。

这是所有的python代码

test.py:

#!/usr/bin/env python
# -*- coding: utf-8 -*- class Human:
"""

"""
def __init__(self):
self.__name = ""
self.__sex = "" def setName(self, name):
self.__name = name def getName(self):
return self.__name def setSex(self, sex):
self.__sex = sex def getSex(self):
return self.__sex name = property(getName, setName) # 就像java中的POJO
sex = property(getSex, setSex) # 就像java中的POJO if __name__ == '__main__': lilei = Human()
lilei.sex = "男"
lilei.name = "李磊"
print "%s %s 出场" % (lilei.name, lilei.sex) hanmeimei = Human()
hanmeimei.sex = "女"
hanmeimei.name = "韩梅梅"
print "%s %s 出场" % (hanmeimei.name, hanmeimei.sex) # Pee的方法
def doPee(self, how):
print "%s %s %s撒尿" % (self.name, self.sex, how) Human.doPee = doPee #动态绑定方法 lilei.doPee("站着")
hanmeimei.doPee("蹲着") # 学习的方法
def doLearning(self, learn):
print "%s: %s" % (self.name, learn) Human.doLearning = doLearning #动态绑定方法 lilei.doLearning("How are you?")
lilei.doLearning("I'm fine, thank you!")

Go 思想

面向对象之于Go,没有继承这么一说,更像是C与Python的结合体,并把鸭子类型发扬到极致。

接口(interface)就好比是一只"鸭子",而interface结构体内包裹的方法就是这只"鸭子"所具有的功能,Go中,接口可以描述为: 具有这些功能的家伙就是这只"鸭子"

方法(func)被定义在结构(类/struct)之外,被绑定于这个结构之上,可以描述为: 这是它的功能 ,当一个struct中的一些方法都包含在某个interface中时,我们就说: 啊哈,这就是那只"鸭子",哪怕它多长了几条腿(func),它也是啊

关于继承,没有,go中虽然内嵌很像继承但不是。继承是一脉相传,而go的内嵌表达出你中有我我中有你的情怀,需要用到某个struct的功能了,那么就对它说 你就是我的一部分

struct、interface、func 这些几乎就是Go面向对象的全部了,如此简洁。

package main

import (
"fmt"
) // 接口 学生
type Student interface {
learningEnglish(string)
} // 结构
type Human struct {
Name string
Sex string
} // 学习英语方法,绑定于Human
func (student Human) learningEnglish(learning string) {
fmt.Printf("%s: %s\n", student.Name, learning)
} // 结构 男人
// go没有继承这个概念,这里是嵌入
type Male struct {
Human "嵌入字段"
} type Female Male // 方法, 绑定到了Human结构
func (this Human) Pee(how string) {
fmt.Printf("%s %s %s撒尿\n", this.Name, this.Sex, how)
} // 学习
func doLearning(learning Student, learing string) {
learning.learningEnglish(learing)
} // Pee
func doPee(human interface {}) {
switch sex := human.(type){
case Male:
sex.Pee("站着")
case Female:
sex.Pee("蹲着")
}
} func main() {
lilei := Male{}
lilei.Name = "李雷"
lilei.Sex = "男"
fmt.Printf("%s %s 出场\n", lilei.Name, lilei.Sex) hanmeimei := Female{}
hanmeimei.Name = "韩梅梅"
hanmeimei.Sex = "女"
fmt.Printf("%s %s 出场\n", hanmeimei.Name, hanmeimei.Sex) doPee(lilei)
doPee(hanmeimei) doLearning(lilei, "How are you?")
doLearning(hanmeimei, "I'm fine, thank you!")
}

摆脱C++/Java/Python等思想的桎梏,才能领略Go的魅力

 
 
分类: Go

关于Java、Python、Go编程思想的不同的更多相关文章

  1. java异常(编程思想)

    通过异常处理错误 java的基本理念是“结构不佳的代码不能运行” 发现错误的理想时机是在编译阶段,也就是在你试图运行程序之前.然而编译期间并不能找出所有的错误,余下的问题必须在运行间解决.这就需要错误 ...

  2. 1.Java基础-面向对象编程思想(封装继承多态接口)

    封装: 1.定义:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别. 2.封装的目的是:增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的 ...

  3. Go学习笔记 - 关于Java、Python、Go编程思想的不同

    ***看了两周七牛团队翻译的<Go语言程序设计>,基本上领略到了Go语言的魅力.学习一个语言,语法什么的任何人都是很容易学会,难就难在充分领略到这门编程语言的思想.*** ## 面向对象 ...

  4. 《Java编程思想第四版完整中文高清版.pdf》-笔记

    D.2.1 安插自己的测试代码 插入下述“显式”计时代码,对程序进行评测: long start = System.currentTimeMillis(); // 要计时的运算代码放在这儿 long ...

  5. (Java编程思想)Thinking in Java

    1. 为什么突然想去研读<Thinking in Java>? 最近终于下定决心撸了一本<Thinking in Java>第四版,虽然在此之前我就久闻这本书的大名,但一直未曾 ...

  6. Java编程思想(第4版) 中文清晰PDF完整版

    Java编程思想(第4版) 中文清晰PDF完整版 [日期:2014-08-11] 来源:Linux社区  作者:Linux [字体:大 中 小]     <Java编程思想>这本书赢得了全 ...

  7. JAVA编程思想——分析阅读

    需要源码.JDK1.6 .编码风格参考阿里java规约 7/12开始 有点意识到自己喜欢理论大而泛的模糊知识的学习,而不喜欢实践和细节的打磨,是因为粗心浮躁导致的么? cron表达式使用 设计能力.领 ...

  8. 【系列】Python编程思想(1):Python简介与开发环境搭建

    李宁老师的 开始学习.   本系列文章深入介绍了Python的各种技术,堪称是目前最全的Python教程.主要目的是让读者可以了解Python的各种核心技术,包括各种Python函数库.本教程使用Py ...

  9. JAVA编程思想(第四版)学习笔记----4.8 switch(知识点已更新)

    switch语句和if-else语句不同,switch语句可以有多个可能的执行路径.在第四版java编程思想介绍switch语句的语法格式时写到: switch (integral-selector) ...

随机推荐

  1. 栈 & 堆 |--> 内存管理

    内存管理: 栈区 [stack]:由编译器自动分配并释放,一般存放函数的参数值,局部变量等 堆区 [heap]:由程序员分配和释放,如果程序员不释放,程序结束时,可能会由操作系统回收 全局区(静态区) ...

  2. 加快XCode编译链接速度(200%+)—XCode编译慢液

    最近在一个大型项目的开发的时候遇到一个很头疼的问题,由于该项目的代码更,每次建立联系1纪要.浪费时间调试.因此,一些研究如何提高编译链接速度,这里给大家分享. 为了提高编译和链接的是以下三种方式的速度 ...

  3. Windows系统下Redis的安装

    Redis是一个用的比较广泛的Key/Value的内存数据库,新浪微博.Github.StackOverflow 等大型应用中都用其作为缓存,Redis的官网为http://redis.io/. 最近 ...

  4. yii中登录后跳转回登录前请求的页面

    当我们请求一个经过权限控制的请求不通过时,会跳转到一个地方请求权限,请求结束后需要跳转回之前的页面.比如我们请求一个需要登录的action,会被跳转到login页面,我们希望登录成功后跳转到我们之前希 ...

  5. CI框架 .htaccess 隐藏url在index.php解决方案

    CodeIgniter(下面简称"CI")是一款国外优秀的PHP轻量级MVC框架,它支持PHP4和PHP5.是开发中小型可拓展性需求高的Web应用程序的利器.眼下你所见到的这个博客 ...

  6. Spring.Net+NHibenate+Asp.Net Mvc+Easyui框架

    Spring.Net+NHibenate+Asp.Net Mvc+Easyui框架 初次接触Spring.Net+NHibenate+Asp.Net Mvc+Easyui框架,查阅了相关资料,了解了框 ...

  7. 【MS SQL】数据库维护计划之数据库备份(二)

    原文:[MS SQL]数据库维护计划之数据库备份(二) 上篇[MS SQL]数据库维护计划之数据库备份(一) 说了数据库备份的一些概念后,这篇以HRP_KQYY数据库备份为例,进行备份计划设置. 考虑 ...

  8. Windows 下安装 Oracle 12c 教程

    原文 Windows 下安装 Oracle 12c 教程 申明:本文原作者:Jmq   本文给大家带来的是 Oracle 12C 的安装教程. 1.准备 1.1 下载 Oracle 12c 安装程序 ...

  9. 开源文档管理系统LogicalDOC测试报告---安装篇

    开源文档管理系统LogicalDOC测试报告---安装篇 分类: Linux2011-06-22 15:40 7436人阅读 评论(3) 收藏 举报 文档管理测试mysql数据库installerja ...

  10. 在MVC中使用SignalR

    在MVC中使用SignalR 接着上一篇:<ASP.NET SignalR系列>第四课 SignalR自托管(不用IIS) 一.概述 本教程主要阐释了如何在MVC下使用ASP.NET Si ...