我最初接触的后端语言是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))