Go 擅长什么

Go 显然不是银弹,软件工程也没有银弹。为了搞清楚 Go 适合做什么,我们先看看Go的诞生。

Go was designed atGooglein 2007 to improveprogramming productivityin an era of multicore, networked machines and large codebases.The designers wanted to address criticism of other languages in use atGoogle, but keep their useful characteristics:

  • static typing and run-time efficiency (likeC++),
  • readability and usability (likePythonorJavaScript),
  • high-performance networking and multiprocessing.
    The designers were primarily motivated by their shareddislike of C++.

Go 在编程语言届里面也是一个新生儿了,从维基百科的短短几行里面我们可以发现,Go在诞生之初就是为了提高编程效率,但是侧重的点是 多核,网络,大型的源码管理。因此我们发现 Go 在实际的体验中,我们也常常用于构建高性能的分布式系统。在 Google 内部,Go 的诞生也是为了填平 C 与 Python 之间的鸿沟,正如定位所言,恰恰属于两者之间。

良好的并发

Go 是一个拥有良好并发资质的语言,我们可以轻易的通过 goroutine 写出简单可靠且高性能的应用,但是值得注意的是,Go并不是拥有极致并发能力的语言,因为对于他来说,始终有着两座大山:GC 与 goroutine,goroutine是一个简单的编程模型,但是并不是一个高性能的编程模式,callback >= reactive >= goroutine > blocking,可以参考下 techempowerc-erlang-java-performance 实际上能够做到性能机制的依然需要2个致命的要素 无GC低线程切换

泛型缺失

这个问题已经不用再提及了,对于Google的工程师因为可能长时间的和 Bytes 打交道,对于OOP那套是无感的(实际上是类型系统的延展),因此反而带来了更多的负面性质,因为我们缺少了大量在 FP 中可以执行的操作符,比如 Map,Reduce,Filter。

关于易读性

我认为 Go 的可读写方向其实指 好读 而非 易读,举个例子

1
2
3
4
5
6
quicksort :: (Ord a) => [a] -> [a]  
quicksort [] = []
quicksort (x:xs) =
let smallerSorted = quicksort [a | a <- xs, a <= x]
biggerSorted = quicksort [a | a <- xs, a > x]
in smallerSorted ++ [x] ++ biggerSorted
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// Generates a slice of size, size filled with random numbers
func generateSlice(size int) []int {

slice := make([]int, size, size)
rand.Seed(time.Now().UnixNano())
for i := 0; i < size; i++ {
slice[i] = rand.Intn(999) - rand.Intn(999)
}
return slice
}

func quicksort(a []int) []int {
if len(a) < 2 {
return a
}

left, right := 0, len(a)-1

pivot := rand.Int() % len(a)

a[pivot], a[right] = a[right], a[pivot]

for i, _ := range a {
if a[i] < a[right] {
a[left], a[i] = a[i], a[left]
left++
}
}

a[left], a[right] = a[right], a[left]

quicksort(a[:left])
quicksort(a[left+1:])

return a
}

从上文我们可以发现 Go 的易读其实相较于 C 进步一大步,而对于真正易读的语言又差了一大步。

Go 擅长的地方

网络和Web服务器

对于大部分人来说,Go能够编译出二进制运行文件 + 良好的并发控制,这简直是为了网络服务器和Web服务器的最佳选择,大家也是这么做的,我们使用Go作为Web服务器。

自动化与命令行工作

Go 是非常适合的自动化工具,对于Python,Java等需要依赖很重的运行时,因此Go既轻量级又快速,并且处理的相对简单的技术逻辑,在社区中已经有人尝试使用 Go 来取缔 Bash Script 对于大部分来说,想要抹平 Bash 在不同系统上的差异可能还真不如直接使用 Go,也替换了那一步 Python 用户。

生产机代码的维护

比如有 gofmt ,lint ,各种检查机制,这些和上面一种情况类型。

Go 不擅长的地方

业务属性较多的地方

无论是 ORM 框架,还是Web框架,Go社区相较于已经成熟的 Java 社区,都是造了一堆玩具状态,并不是不能很高效的进行业务开发。

极限性能要求

OS Kenerl,Banking,Game 这些领域依然不是带有GC的语言可以打入的领域。

参考