为什么选择Go语言

204 阅读2分钟

1.概览

Golang语法简洁, 语义清晰。 并发模式简单有效, 执行效率和开发效率都很高。 云原生生态好。

2. 语法简洁清晰,开发效率高

Rob PikeKen ThompsonRobert 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早期版本和其他语言的性能对比,数据来源于网络

Xnip2022-02-19_11-26-33.jpg

5. 云原生生态好

目前已经进入云时代, golang是云时代最好的开发语言。 目前云时代最基础的技术,如: Kubernetes ETCD Docker 等等都是基于golang的项目,可以说golang就是为了云而生的。 如果采用其他语言来开发云原生项目,从一开始就比用golang开发的项目差了一截。 所以,总而言之,最后我选择了 GO 来作为我的主力语言。

6. 总结

Golang语言是2020年代的C语言,很好的并发模式,和都很高的执行效率与开发效率。