IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 学习Golang,Java,C++区别 -> 正文阅读

[Java知识库]学习Golang,Java,C++区别

(文章有点长,算是个人学习的一个小总结,大家如果有耐心看完欢迎提出意见)

Golang处在Java和C++中间,他有着比Java更快地性能,也有比C++更方便的开发方式,但Golang在很多方面还是跟Java有些雷同,我们来看看三者中间的差别和相似之处,然后着重看看Golang和Java的异同。

三者的不同

1.语言类型和平台

1.1语言类型

语言类型分为编译和解释,顾名思义,编译型语言就是把所有的代码一次型编译,然后运行,而解释型语言就相反的,是一句一句的编译解释运行。

Go语言和C++语言一样是编译型的静态语言,所以在运行Go和C++程序之前,先要将其编译成二进制的可执行文件。

所以像C++我们安装的MingGW其实就是C++的编译器,帮助C++实现编译的。

而相对而言的,Java就是可以说是编译型语言也可以说成是解释型语言,首先Java会将所有代码编译成.class文件,这个过程是编译过程,所以Java可以说成是编译型语言,然后.class文件会被放到虚拟机上解释运行,也就是说一句一句从.class文件解释成机器能明白的语言,然后运行。

这里的差别就是编译型语言Go或者C++是直接将语言编译成机器能懂得文件,然后就可以直接运行了,而Java有了.class这中间一步,这个文件是机器看不懂的,所以要在JVM上再加一步解释

从这个方面来看,C++和Go的代码运行性能是比Java快的,毕竟编译型语言比解释型语言块要很正常。

1.2平台

在C++比较有受欢迎的事linux编程,这个问题就导致如果我们在windows的环境上写关于linux编程的代码,比如最简单的在进行网络编程的时候

在linux环境上的包是sys/socket.h

而对于windows上的包是winsock.h/winsock2.h

所以如果我们在windows上开发的网络编程代码,要部署到linux系统的服务器上去运行的话,这是肯定行不通的,而java和go没有这个问题。

java我们都清楚,他是有java虚拟机的,也就是说不管你代码到哪个系统,所有代码其实都是运行在虚拟机上的,所以就没有系统差异一说。

而Go和C++一样是编译型原因,但是Go也是可以跨平台运行的语言,但是Go又不像Java一样需要虚拟机这样一个中间过程,

Go这个实现跨平台的过程,我的简单理解是

  1. 一个是Go没有Windows和Linux区分的工具包,这个是关键
  2. Go在编译的时候可以选择需要运行的平台SET GOOS=linux // 目标平台是linux,如果是window那么这个参数设为darwin

2.内存管理

GO和Java一样有内存管理机制,也就是Java中常见的垃圾回收,在Go里面也有,而这一点是C++没有的,也是C++不方便的一个方面,因为程序员需要时刻的去记住创建之后要释放内存。这个在后面写Java和Go的区别重点学一下

3.语言特性

Go是不支持类与类之间的继承关系的,在go语言里面,有对象和接口的概念(刚入门的个人理解,后面有更深的理解了再来补充)

一般来说,最好一个文件.go就是一个类,当然也可以放多个struct来放在一个文件里然后用func(*className)来实现多个类的方法
所以go的类的属性和方法是分离开的,如果一个文件是一个类方法集中在interface中申明可以系统一点,(当然不申明也可以用func(*className)实现),然后一个一个实现。

举个例子,我们要实现一个学生类,其中属性包括,姓名,年龄,性别,方法包括,写作业,考试,我们可以写成这样

import "fmt"

//方法接口应该是类名的首字母大写
type Student interface {
	DoHomework()
	TakeExam()
}
type student struct {
	Name string
	Age  int
	Sexy string
}
//提供初始化方法
func NewStudent(name, sexy string, age int ) Student{
	return &student{
		Name: name,
		Sexy: sexy,
		Age: age,
	}
}
//接口的实现
func (s student) DoHomework() {
	fmt.Printf("I'm doing my homework")
}
func (s student) TakeExam() {
	fmt.Printf("I'm taking an exam")
}

得到一个这样的类之后,我们可以通过这两种方法去实例化并使用这个类

package main

func main()  {
	var stu student
	stu.DoHomework()

	stu2 := NewStudent("s", "男", 10)
	stu2.DoHomework()
}

go每个类之间都是独立存在的,接口也仅限于当前文件内,类与类之间并无父子继承关系。

go不允许重载但是允许重写,重载和重写看这个,但是go的重写其实不是严格的重写,因为他并没有父子的继承关系,只是如果在同一个文件内有多个类的话,类于类之间的函数名可以重复。比如下面这样

import "fmt"


type student struct {
	Name string
	Age  int
	Sexy string
}

type teacher struct {
	
}

func (t teacher)TakeExam()  {
	fmt.Printf("I'm taking an exam")
}
func (s student) DoHomework() {
	fmt.Printf("I'm doing my homework")
}

func (s student) TakeExam() {
	fmt.Printf("I'm taking an exam")
}

java和C++中的函数重载和重写就不写了,因为他们都支持。

4.开发性能与效率

高质量的C++代码性能依旧是最猛的,这个无可厚非,Go其次,毕竟编译型语言比解释型语言的优势在那。

(仅限于了解过的框架,有经验的大佬可以给我提提意见,我去学习一下)
Go写开发代码的时候,比如go-kit框架,没有了SpringBoot那种特别多的配置文件,还有各种@关键字,用go-kit做开发的话就完全是三层架构,并且这个架构只是工具包并不是框架,所以用起来简单许多。

在多线程方面,Go的go routine创建的是协程,协程又是轻量级线程,所以效率肯定比线程块,并且只需要go + xx就能开启一条routine,比Java的多线程要方便不少。

Java和Go的区别


TO BE CONTINUE…

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-11-20 18:15:31  更:2021-11-20 18:16:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:34:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码