1.概览
Golang语法简洁, 语义清晰。 并发模式简单有效, 执行效率和开发效率都很高。 云原生生态好。
2. 语法简洁清晰,开发效率高
Rob Pike、 Ken Thompson、Robert Griesemer 他们当初在谷歌由于受够了 C++ 臃肿的语法,为了提高谷歌的分布式系统的效率, 三位决定创造一门简单,高效的语言, 这就是现在的Golang。
以 少即是多 的理念下, Golang 尽量力求不重复造轮子,不用复杂冗余的修饰符( 对, 说的就是Java )。
Go VS Java
// Java
public class MainClass {
public static void main(String[] args) {
for (int counter = 0; counter <= 10; counter++){
System.out.printf("Fibonacci of %d is: %d\n", counter, fibonacci(counter));
}
}
public static long fibonacci(long number) {
if ((number == 0) || (number == 1))
return number;
else
return fibonacci(number - 1) + fibonacci(number - 2);
}
}
// Go
func fibonacci() func() int{
a, b := 0, 1
return func() int{
a, b = b, a+b
return a
}
}
func main() {
f := fibonacci()
for i := 0; i < 10; i++ {
fmt.Println(f())
}
}
3. 并发模式
Go采用GMP的并发模型, 具体内容可以自行百度。以协程的方式运行, Golang会自己负责协程的调度。 以4核心的CPU为例, Golang可以轻松运行上万的并发。
func main() {
for i := 0; i < 10000; i++ {
go countFibonacci(5000)
}
}
func countFibonacci(n int) {
f := fibonacci()
for {
num := f()
fmt.Println(num)
if num >= n {
return
}
}
}
而golang的并发控制,除了提供了并发读写锁等并发原语外, 最常见的是通过 channel 来实现并发交互, 如下:
func main() {
var c = make(chan int)
go readChan(c)
writeChan(c)
}
func readChan(c <-chan int) {
for {
select {
case b := <- c :
fmt.Println(b)
}
}
}
func writeChan(c chan<- int) {
for i := 0; i < 10; i++ {
c <- i
time.Sleep(2*time.Second)
}
}
4. 执行效率
golang 的执行效率接近C,略慢于C。经过这么多版的优化,已经比Java执行效率高,考虑到并发上的优势,golang更是将执行效率提高了不止一个数量级, 开发效率更是远高于Java。
golang 执行的时候,可以生成Plan9风格的伪汇编, 对汇编熟悉的小伙伴可以通过汇编了解golang执行的底层过程。能迅速的对golang运行时有更深入的理解。
下图为golang早期版本和其他语言的性能对比,数据来源于网络
5. 云原生生态好
目前已经进入云时代, golang是云时代最好的开发语言。 目前云时代最基础的技术,如: Kubernetes ETCD Docker 等等都是基于golang的项目,可以说golang就是为了云而生的。 如果采用其他语言来开发云原生项目,从一开始就比用golang开发的项目差了一截。 所以,总而言之,最后我选择了 GO 来作为我的主力语言。
6. 总结
Golang语言是2020年代的C语言,很好的并发模式,和都很高的执行效率与开发效率。