Go与Java

136 阅读5分钟

我最初接触的后端语言是java,现在刚开始接触golang,那么同为后端开发语言,两者的区别是什么?

所以我在开始学习golang前查询了资料,在第一节课接触后感受最深的就是go语法的简洁性。声明变量全部通过var来进行(数据类型可给可不给,根据上下文自动推断),常量用const声明(数据类型根据上下文自动推断);循环只有for,省去了圆括号,就算加上编译时会自动去掉;switch语句可以直接替代复杂条件判断语句,同时不存在case穿透等等

这是我根据查阅的资料整理的笔记:

Go 语言(通常称为 Golang)和 Java 是两种在后端开发中非常流行的编程语言,尽管它们有一些相似之处,但也存在显著的区别。下面是对这两种语言的一些比较:

基本特性

Java 类型:Java 是一种静态类型的编程语言,这意味着所有的变量在编译时必须明确声明类型。  运行环境:Java 程序编译成字节码(.class 文件),然后由 Java 虚拟机(JVM)解释执行。这意味着 Java 可以跨平台运行。  内存管理:Java 使用自动垃圾收集机制来管理内存,这减轻了程序员的负担,但也可能导致性能上的延迟。  并发模型:Java 中的并发主要通过线程实现。Java 提供了丰富的 API 来支持线程同步和通信,但也可能带来复杂性和潜在的死锁问题。

Go 类型:Go 同样是一种静态类型的编程语言,但它试图简化语法和语义,使代码更易读和维护。  运行环境:Go 程序直接编译成本地机器码,在目标平台上直接运行,不需要虚拟机。  内存管理:Go 也采用了垃圾回收机制来管理内存,但是它的设计目标是尽量减少垃圾回收带来的性能影响。  并发模型:Go 提供了 goroutines 和 channels 来实现轻量级的并发。goroutines 是用户空间的线程,可以由 Go 运行时调度,从而实现高效的并发编程。

Go 语言在性能方面通常优于 Java,特别是在高并发和低延迟的应用场景中。****

性能与生态系统

性能:一般来说,Go 因为是直接编译成本地机器码,所以在某些基准测试中可能比 Java 更快。但是,Java 经过多年的优化,在某些场景下也可以达到很高的性能水平。 

生态系统:

Java自1995年发展以来已经拥有庞大且完整的生态系统,大量的框架和库可供选择,如 Spring、Hibernate 等,这使得 Java 成为企业级应用开发的首选语言之一。

Go 的生态系统相对较小,但增长迅速,尤其是在网络服务和微服务领域。 Go 语言在云原生技术领域非常流行,如 Kubernetes、Docker 等都是用 Go 语言编写的。Go 语言在构建微服务方面表现优秀

应用场景

Java:适合企业级应用、桌面应用、移动应用(如 Android)、大数据处理(Hadoop 等)、云服务等。  Go:更适合构建高性能的网络服务、微服务架构、

DevOps 工具(DevOps 工具是指一系列旨在提高软件开发、测试、部署和运维过程效率的工具和技术。DevOps(Development + Operations)的理念强调开发人员和运维人员之间的紧密协作,以加快软件交付周期并提高产品质量。)、 实时系统等。

**
**

学习曲线

Java:对于初学者来说,Java 的学习曲线可能稍微陡峭一些,因为它有着复杂的类库和生态系统。  Go:Go 语言的设计初衷就是为了简单和高效,因此它的学习曲线相对平缓,适合快速上手。

结论

选择 Go 还是 Java 主要取决于具体的项目需求和个人偏好。如果你需要一个成熟的企业级解决方案,Java 可能是一个更好的选择。如果你正在寻找一种可以快速开发高性能网络服务的语言,那么 Go 会是一个不错的选择。当然,最终的选择还应该考虑到团队的熟悉度、项目规模、维护成本等因素。

**
**

我个人的总结就是golang目前普遍使用在大厂,当前社会内卷环境下,在精学一门语言的生态条件下,多了解一些技术,扩展视野,可以给我们的职业生涯(尽管还没开始)和技术栈带来很多的好处((●'◡'●))

附带一下我学了半小时的笔记

//变量声明有两种方式
//1. var name (变量类型 可写可不写 根据需要)= value
//2. name := value

//golang 常量没有确定类型 根据上下文自动确定类型
// 声明常量时 将var换成const即可
var name = "initial"

var a, b int = 1, 2

var c = b

var d float32

f := float64(d)

//g := a+"yyyyy" //整型和字符串拼接 报错
g := name + "6666666"

//打印输出
fmt.Println(name)

fmt.Print(a + b)

fmt.Printf("%d", c)

fmt.Println(d, f)

var l = true
fmt.Println(g, l)

//TIP Press <shortcut actionId="ShowIntentionActions"/> when your caret is at the underlined or highlighted text
// to see how GoLand suggests fixing it.
s := "gopher"
fmt.Println("Hello and welcome, %s!", s)

for i := 1; i <= 5; i++ {
    fmt.Println("i =", 100/i)
}
//死循环
//for {
//  fmt.Println(666)
//}

//去掉i++ 也是死循环
//for i := 0; i < 2; {
//  fmt.Println(6666)
//}

//switch语句  不用case  不会去跑其它分支
switch a {
case 1:
    fmt.Println("1")
case 2:
    fmt.Println("2")
default:
    fmt.Println("other")
}

//可以不写switch条件 取代 if语句
t := time.Now()
switch {
case t.Hour() < 12:
    fmt.Println("before noon")
default:
    fmt.Println("sfter noon")
}

//数组   一般不用数组   因为数组长度是固定的  使用切片
var p [5]int
p[4] = 66
fmt.Println(p[3], p[4], len(p))

o := [5]int{1, 2, 3, 4, 5}
for i := 0; i < 5; i++ {
    fmt.Println(o[i])
}

//切片 make创建
j := make([]string, 2)
j[0] = "'"
j[1] = "9"
j = append(j, "m")
j = append(j, "c")
fmt.Println(j) //[',9,m,c]

//slice 自动扩容
r := make([]string, len(j))
copy(r, j)
fmt.Println(r)
fmt.Println(j[2:3]) //切片
fmt.Println(r[:3])
fmt.Println(j[1:])

good := []string{"i", "i", "p"}
fmt.Println(good)

//map 是完全无序的  通过make创建
//是实际中使用最频繁的数据结构
m := make(map[string]int)
m["one"] = 6
fmt.Println(m)
fmt.Println(len(m))