go与其他语言区别,go与Java、Python有什么区别

news2024/9/26 1:21:24

零、go与其他语言

0、什么是面向对象

在了解 Go 语言是不是面向对象(简称:OOP) 之前,我们必须先知道 OOP 是啥,得先给他 “下定义”

根据 Wikipedia 的定义,我们梳理出 OOP 的几个基本认知:

  • 面向对象编程(OOP)是一种基于 “对象” 概念的编程范式,它可以包含数据和代码:数据以字段的形式存在(通常称为属性或属性),代码以程序的形式存在(通常称为方法)。
  • 对象自己的程序可以访问并经常修改自己的数据字段。
  • 对象经常被定义为类的一个实例。
  • 对象利用属性和方法的私有/受保护/公共可见性,对象的内部状态受到保护,不受外界影响(被封装)。

基于这几个基本认知进行一步延伸出,面向对象的三大基本特性:

  • 封装
  • 继承
  • 多态

1、Go语言和Java有什么区别?

1、Go上不允许函数重载,必须具有方法和函数的唯一名称,而Java允许函数重载。

2、在速度方面,Go的速度要比Java快。

3、Java默认允许多态,而Go没有。

4、Go语言使用HTTP协议进行路由配置,而Java使用Akka.routing.ConsistentHashingRouter和Akka.routing.ScatterGatherFirstCompletedRouter进行路由配置。

5、Go代码可以自动扩展到多个核心,而Java并不总是具有足够的可扩展性。

6、Go语言的继承通过匿名组合完成,基类以Struct的方式定义,子类只需要把基类作为成员放在子类的定义中,支持多继承;而Java的继承通过extends关键字完成,不支持多继承。

2、Go 是面向对象的语言吗?

是的,也不是。原因是:

  1. Go 有类型和方法,并且允许面向对象的编程风格,但没有类型层次。
  2. Go 中的 "接口 "概念提供了一种不同的方法,我们认为这种方法易于使用,而且在某些方面更加通用。还有一些方法可以将类型嵌入到其他类型中,以提供类似的东西,但不等同于子类。
  3. Go 中的方法比 C++ 或 Java 中的方法更通用:它们可以为任何类型的数据定义,甚至是内置类型,如普通的、"未装箱的 "整数。它们并不局限于结构(类)。
  4. Go 由于缺乏类型层次,Go 中的 "对象 "比 C++ 或 Java 等语言更轻巧。

3、Go 实现面向对象编程

封装

面向对象中的 “封装” 指的是可以隐藏对象的内部属性和实现细节,仅对外提供公开接口调用,这样子用户就不需要关注你内部是怎么实现的。

在 Go 语言中的属性访问权限,通过首字母大小写来控制:

  • 首字母大写,代表是公共的、可被外部访问的。
  • 首字母小写,代表是私有的,不可以被外部访问。

Go 语言的例子如下:

type Animal struct {
	name string
}

func NewAnimal() *Animal {
 	return &Animal{}
}

func (p *Animal) SetName(name string) {
 	p.name = name
}

func (p *Animal) GetName() string {
 	return p.name
}

在上述例子中,我们声明了一个结构体 Animal,其属性 name 为小写。没法通过外部方法,在配套上存在 Setter 和 Getter 的方法,用于统一的访问和设置控制。

以此实现在 Go 语言中的基本封装。

继承

面向对象中的 “继承” 指的是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

从实际的例子来看,就是动物是一个大父类,下面又能细分为 “食草动物”、“食肉动物”,这两者会包含 “动物” 这个父类的基本定义。

从实际的例子来看,就是动物是一个大父类,下面又能细分为 “食草动物”、“食肉动物”,这两者会包含 “动物” 这个父类的基本定义。

在 Go 语言中,是没有类似 extends 关键字的这种继承的方式,在语言设计上采取的是组合的方式

type Animal struct {
 	Name string
}

type Cat struct {
 	Animal
 	FeatureA string
}

type Dog struct {
 	Animal
 	FeatureB string
}

在上述例子中,我们声明了 Cat 和 Dog 结构体,其在内部匿名组合了 Animal 结构体。因此 Cat 和 Dog 的实例都可以调用 Animal 结构体的方法:

func main() {
 	p := NewAnimal()
 	p.SetName("我是搬运工,去给煎鱼点赞~")

 	dog := Dog{Animal: *p}
 	fmt.Println(dog.GetName())
}

同时 Cat 和 Dog 的实例可以拥有自己的方法:

func (dog *Dog) HelloWorld() {
 	fmt.Println("脑子进煎鱼了")
}

func (cat *Cat) HelloWorld() {
 	fmt.Println("煎鱼进脑子了")
}

上述例子能够正常包含调用 Animal 的相关属性和方法,也能够拥有自己的独立属性和方法,在 Go 语言中达到了类似继承的效果。

多态

多态

面向对象中的 “多态” 指的同一个行为具有多种不同表现形式或形态的能力,具体是指一个类实例(对象)的相同方法在不同情形有不同表现形式。

多态也使得不同内部结构的对象可以共享相同的外部接口,也就是都是一套外部模板,内部实际是什么,只要符合规格就可以。

在 Go 语言中,多态是通过接口来实现的:

type AnimalSounder interface {
 	MakeDNA()
}

func MakeSomeDNA(animalSounder AnimalSounder) {		// 参数是AnimalSounder接口类型
 	animalSounder.MakeDNA()
}

在上述例子中,我们声明了一个接口类型 AnimalSounder,配套一个 MakeSomeDNA 方法,其接受 AnimalSounder 接口类型作为入参。

因此在 Go 语言中。只要配套的 Cat 和 Dog 的实例也实现了 MakeSomeDNA 方法,那么我们就可以认为他是 AnimalSounder 接口类型:

type AnimalSounder interface {
 	MakeDNA()
}

func MakeSomeDNA(animalSounder AnimalSounder) {
 	animalSounder.MakeDNA()
}

func (c *Cat) MakeDNA() {
 	fmt.Println("煎鱼是煎鱼")
}

func (c *Dog) MakeDNA() {
 	fmt.Println("煎鱼其实不是煎鱼")
}

func main() {
 	MakeSomeDNA(&Cat{})
 	MakeSomeDNA(&Dog{})
}

当 Cat 和 Dog 的实例实现了 AnimalSounder 接口类型的约束后,就意味着满足了条件,他们在 Go 语言中就是一个东西。能够作为入参传入 MakeSomeDNA 方法中,再根据不同的实例实现多态行为。


在日常工作中,基本了解这些概念就可以了。若是面试,可以针对三大特性:“封装、继承、多态” 和 五大原则 “单一职责原则(SRP)、开放封闭原则(OCP)、里氏替换原则(LSP)、依赖倒置原则(DIP)、接口隔离原则(ISP)” 进行深入理解和说明。

4、go语言和python的区别:

1、范例

Python是一种基于面向对象编程的多范式,命令式和函数式编程语言。它坚持这样一种观点,即如果一种语言在某些情境中表现出某种特定的方式,理想情况下它应该在所有情境中都有相似的作用。但是,它又不是纯粹的OOP语言,它不支持强封装,这是OOP的主要原则之一。

Go是一种基于并发编程范式的过程编程语言,它与C具有表面相似性。实际上,Go更像是C的更新版本。

2、类型化

Python是动态类型语言,而Go是一种静态类型语言,它实际上有助于在编译时捕获错误,这可以进一步减少生产后期的严重错误。

3、并发

Python没有提供内置的并发机制,而Go有内置的并发机制。

4、安全性

Python是一种强类型语言,它是经过编译的,因此增加了一层安全性。Go具有分配给每个变量的类型,因此,它提供了安全性。但是,如果发生任何错误,用户需要自己运行整个代码。

5、管理内存

Go允许程序员在很大程度上管理内存。而,Python中的内存管理完全自动化并由Python VM管理;它不允许程序员对内存管理负责。

6、库

与Go相比,Python提供的库数量要大得多。然而,Go仍然是新的,并且还没有取得很大进展。

7、语法

Python的语法使用缩进来指示代码块。Go的语法基于打开和关闭括号。

8、详细程度

为了获得相同的功能,Golang代码通常需要编写比Python代码更多的字符。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/495211.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【转存】Go语言设计模式

导语| 设计模式是针对软件设计中常见问题的工具箱,其中的工具就是各种经过实践验证的解决方案。即使你从未遇到过这些问题,了解模式仍然非常有用,因为它能指导你如何使用面向对象的设计原则来解决各种问题,提高开发效率&#xff0…

[漏洞分析] 用chatGPT分析CVE-2023-0386 overlay内核提权

文章目录 漏洞简介环境搭建漏洞原理补丁分析命名空间用户命名空间 overlay文件系统原理创建一个overlay文件系统 漏洞触发逻辑 漏洞利用fuse文件系统漏洞利用touch命令冷知识exp 总结参考 本文的理论知识(命名空间、overlay文件系统、fuse文件系统等)均来…

档案馆库房环境温湿度空气质量等相关要求

档案库房防潮工作,就是要将库内相对湿度控制在规定的范围之内,这个范围就是由建设部和国家档案局共同批准颁布的强制性行业标准《档案馆建设设计规范》对档案库房的温湿度范围已作出明确的要求:温度14℃~24℃,湿度45%&…

深入理解Java虚拟机——垃圾回收算法

1.前言 垃圾回收需要完成的三件事 首先我们需要明白垃圾回收需要完成的三件事: 哪些内存需要回收 堆内存中的对象所使用的内存方法区中的废弃的常量以及不再使用的类型 什么时候回收 当对象死亡方法区中某些内容(常量和类型)不再被使用 如…

AI绘画天花板——Midjourney注册使用保姆级教程(5月5日验证有效)

大家好,我是可夫小子,关注AIGC、读书和自媒体。解锁更多ChatGPT、AI绘画玩法。加我,备注:aigc,拉你进群。 现在市面上AI绘图大概有三大阵营:Midjourney、Stable Diffusion,还有一个就是OpenAI实…

HashSet和HashMap内部结构分析

首先明确一点:HashSet的底层就是HashMap HashSet与HashMap的不同点: HashMap存储的是键值对(也就是key-value),即在调用HashMap的put方法时传入的两个值,而HashSet其实也是存储的键值对,但是键…

TR0ll

总结:提权思路上,利用内核漏洞提权;找可编辑的计划任务脚本:反弹shell;创建可执行的root文件,获取root权限;写入ssh公钥。 思路:思路是来说就是正常的思路,找ip&#xf…

【c语言】字符串复制 | API仿真

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ …

CentOS 7.x 安装 JDK1.8

1. JDK 下载 地址: Java Archive | Oracle 我这里选择的版本为 jdk-8u361-linux-x64.rpm 将 JDK 安装包通过 ftp 工具上传到 CentOS 系统&#xff0c;我这里使用 WinSCP 上传到 /usr/java 目录下(目录不存在的话就新建)。 2、进入 CentOS 终端&#xff0c;查看是否有默认安装…

Java简介和基础语法

文章目录 一、java简介二、Java 基础语法总结 一、java简介 通过一个简单的实例来展示 Java 编程&#xff0c;创建文件 HelloWorld.java(文件名需与类名一致), 代码如下&#xff1a; public class HelloWorld {public static void main(String[] args) {System.out.println(&q…

pycharm 安装gerrit插件

安装Gerrit File -> Settings -> Plugins&#xff0c;搜索Gerrit&#xff0c;如果没有安装&#xff0c;就选择install&#xff0c;安装完成后重启IDEA 配置Gerrit File -> Settings -> Version Control&#xff0c;输入Gerrit web-ui登录地址以及账号密码 Passow…

c#笔记-方法

方法 方法定义 方法可以将一组复杂的代码进行打包。 声明方法的语法是返回类型 方法名 括号 方法体。 void Hello1() {for (int i 0; i < 10; i){Console.WriteLine("Hello");} }调用方法 方法的主要特征就是他的括号。 调用方法的语法是方法名括号。 He…

K8S:K8S自动化运维容器化(Docker)集群程序

目录 一、K8S概述 1、什么是K8S 2、为什么要用K8S 3、作用及功能 二、K8S的特性 1、弹性伸缩 2、自我修复 3、服务发现和复制均衡 5、自动发布和回滚 6、集中化配置管理和秘钥管理 7、存储编排 8、任务批量处理运行 三、K8S的集群架构 四、K8S的核心组件 1、Mast…

Type-C接口供电小功率设备解决方案

随着Type-C接口的普及&#xff0c;全球使用Type-C接口的设备在稳步上升&#xff0c;因为它更方便&#xff0c;更安全&#xff0c;更环保&#xff0c;如今在生活中可谓是随处可见。 那么在传统的小功率设备大部分还在使用DC圆头供电&#xff0c;虽然成本很低&#xff0c;但是此类…

数字化转型利器,云表无代码“打破”工业软件开发壁垒

近年来&#xff0c;“数字化”概念成为了各行各业的“热词”&#xff0c;作为与信息化程度高度相关的工业软件&#xff0c;在数字化转型中扮演着不可或缺的角色。据 Gartner最新研究数据显示&#xff0c;目前中国工业软件市场规模已经达到了380亿美元&#xff0c;但与发达国家相…

ArcMap最短路径分析和网络数据集的构建

打断相交点 1.单击【编辑器】工具条上的编辑工具。 2.选择要在交叉点处进行分割的线要素。 3.单击【高级编辑】工具条上的打断相交线工具。 4.默认或可输入拓扑容差。 5.单击确定。 结果:所选线在相交处分割为多个新要素。“打断”操作还会移除叠置的线段-例如&#xff0…

HR如何快速提升工作效率?

从招聘到用人管理各个环节&#xff0c;人力资源部门都是公司最重要的职能部门之一&#xff0c;hr的日常工作涉及众多复杂繁琐的内容&#xff0c;比如人员招聘&#xff0c;考核培训等都离不开大量的数据整理和录入操作&#xff0c;但那些和“人”相关的数据信息&#xff0c;经常…

2023.03 青少年机器人技术等级考试理论综合试卷(四级)

2023 年 3 月青少年机器人技术等级考试理论综合试卷&#xff08;四级&#xff09; 一、单选题(共 20 题&#xff0c;共 80 分) 1. Arduino C 语言中&#xff0c;前缀 0x 表示的数制是&#xff1f;&#xff08;D &#xff09; A. 二进制 B. 八进制 C. 十进制 D. 十六进制 2. Ard…

从0学会Spring框架

文章目录 1. 对Spring的理解2. Spring IoC3. DI4. 如何创建一个Spring项目4.1 创建一个Maven项目4.2 添加Spring框架支持4.3 添加启动类 5. 存储Bean对象5.1 添加配置文件5.2 创建Bean对象5.3 注册Bean 6. 获取并使用Bean对象7. 更简单存储Bean对象的方式7.1 前置工作7.2 添加存…

VScode里的终端,Anaconda下的命令提示符和 PowerShell的联系

目录 PowerShell和CMD的区别Anaconda Prompt 和 Anaconda PowerShell Prompt取消默认激活conda中的base环境在conda里设置取消默认激活base环境在VScode里设置取消默认激活base环境手动控制进出base环境 PowerShell和CMD的区别 PowerShell和CMD都是命令行界面工具&#xff0c;…