Golang的罪与罚

Go语言特点

Golang(Go)是一门出色的编程语言,以其简洁、高效和易用而受到广泛欢迎。在设计Golang时,语言的创建者们深思熟虑地融入了许多独特的设计思路和哲学,使其在各种场景下呈现出强大的功能和优势。本文将探讨Golang的语言设计以及背后的思考和哲学,并与其他语言进行横向对比。

简洁和高效的设计

Golang的语言设计注重简洁和高效。它丢弃了许多其他语言中繁琐和冗长的语法和特性,将代码精简到了最简形式。这使得Golang代码易于阅读、编写和维护,并且在运行时具有卓越的性能。与其他语言相比,Golang的编译速度非常快,这意味着开发者可以更快地构建和测试他们的应用程序。

并发编程的支持

Golang在设计中专注于支持并发编程,使得编写高效的并发代码变得更加容易。它提供了轻量级的Go协程(goroutine)和通道(channel)机制,可以用于在程序中实现并发和消息传递。通过这种方式,开发者可以更好地利用多核处理器,提高程序的性能。

内存管理

Golang在内存管理方面有独特的设计。它使用了一种称为垃圾回收(garbage collection)的机制,自动管理动态分配的内存。这减轻了开发者的负担,不再需要手动分配和释放内存。垃圾回收器可以自动识别和回收不再使用的内存,从而避免内存泄漏和许多其他内存相关的错误。

开放的标准库

Golang提供了一个丰富的标准库,其中包含许多常用的功能和工具,可以帮助开发者更轻松地构建应用程序。这些包括文件操作、网络编程、加密解密、并发编程等。通过使用这些标准库,开发者可以节省大量的时间和精力,而不必从头编写所有的功能。

goroutine

golang中最重要的特色就是goroutine。从函数式角度出发这就是用户维度的continuation,golang并不会让代码的性能变得更高,Java存在Thread和纤程之后理论上并发的处理能力并不一定比golang差。erlang也很早就能支持这种用户维度的线程。golang做得比较好的一点是做了非常方便的封装


go func(){
}

就可以启动一个新的协程

二进制编译

所有golang的代码都是可以静态编译的,启动的时候也不存在一个JVM的虚拟机需要先启动,所以相对而言对于小工程来说golang能得到一个非常小的可执行文件,内存占用也相对较小。但是这一点对于一些企业级的应用上来说还真的不一定,这时候最终打包出来的镜像和应用占用的内存消耗并不一定比java少多少,大概率还是在一个量级的。

工具链

Golang 官方提供了一系列开发工具链,这使得在vim或者emacs这样的编辑器中也能获得不错的开发体验。

学习编程语言

语言都是用来交流,描述事物的。编程语言也是一种语言,和自然语言不同的是:编程语言是准确的(即使LLM成熟了可能也很难解决自然语言二义性的问题,这是自然语言定义的本质上带来的问题)、运行在计算机(人脑也可以解析)上的一门语言,用来和计算机交流的一门语言。

既然是一门语言,和学习自然语言类似,我们在学习的时候都会经历一些相同的步骤。学习语言的基本组成(词语、语法等等);学习怎么使用这些基础组件 组合出丰富的表达能力(怎么遣词造句、组成段落);学习怎么凝练地描述一个概念。翻译上有所谓的信雅达的概念,在使用自然语言和编程语言的时候其实也存在这个问题——如何将一个事物描述得凝练准确。

提供了哪些基础能力和类型?

Golang 提供了基础类型包括:

  • string
  • int (int32 int64)
  • bool

基本的数据结构

  • array 数组,几乎所有的编程语言都提供了这种基础的数据类型,因为这就是计算机内存中一片连续的内存空间,数据的长度是固定的。
  • slice 切片,有点类似c++中的vector,是可以动态增长的数据,程序员不需要关心需要开辟多大的内存,这个数据结构可以自动扩容、缩容。
  • map

数据操作

  • make 用来新建数组或者map,还有chan

如何构建复杂的模型?

golang 提供了struct 来构建复杂的数据结构

// 直角坐标点
type Point struct{
    x float64,
    y float64
}

// 极坐标点
type RPoint struct{
    // 半径
    r float64,
    // 角度
    d floadt64
}

// 线段,两点确定一个直线
type Line struct{
    a Point,
    b Point,
}

通过struct可以构造出复杂的数据结构来给各种业务进行建模,对比java的方式是通过class来定义数据结构。class可以认为是struct的扩展,但是java本身的设计限制了像c++那样的多重继承,而且java的设计模式中也不推荐过于依赖继承的方式来扩展数据模型,多重继承也是被限制的。(组合优于扩展) 那么要怎么扩展和一个已有的结构呢?

My Will (遗嘱)

没错,这是一篇关于遗嘱的博客。我没有遇到什么问题,恰恰相反,我现在活得好好的并且热爱着我现在的生活。正是因为我感激着生活带给我的快乐,所以我想在这片博客中写下自己的遗嘱。你永远不知道意外和明天哪一个先到来。