Golang 从入门到放弃 -0x00

–Author:Raymond

写在前面,学习golang前:

我希望你至少了操作系统和开发相关软件使用的基本逻辑,知道目录树是什么意思,知道终端是个什么东西,知道文件存在哪里。

我希望你至少掌握一种编程语言。可以是Java可以是Python,也可以是JS或C++。出于一种莫名的坚持,我并不觉得golang是一种好的计算机编程的入门用的语言。

我希望你至少有看懂英文文档的能力,至少是借助工具看懂英文文档和英文提示的能力。

所以在接下来的文章里,我并不打算教你函数是什么,循环是什么,库又是什么。或是”error“表示出错,”fail”代表失败。

为什么是golang

如果你打算选择一个相对流行后端技术栈来充实你的短板。在你面前的选择很多:

Node.js, Python, Java, C++, .Net Core,PHP,Ruby

如果稍小众一点,还有Scala,Rust。

精通前端的,更喜欢用Node.js,因为语法一致,能节约不少入门时间。对我个人来说,Node宇宙太重了,不是迫不得己,不想趟这浑水。

Java是一整个体系,SpingMVC->Spring->SpringBoot->Structs->MyBatis/Hibernate->maven/gradle->tomcat/apache。陷进去后你会突然发现,咦,我怎么没时间当全栈了。全栈开发其实有一个非常现实的场景,即开发多半是单打独斗。那些为了小组开发对项目规范化或是抽象协同的工程特性往往会拖自己的后腿。

Python是一个不错的选择,当然,这里我们讨论Go。随便给个理由,Python GIL锁,影响性能发挥/Python布署有非常混乱的包与库及版本兼容问题/Python在多数情况下有极差的运行性能。

。。。。。

我不想继续评价每一种后端技术栈的优劣。选择技术栈,就像是单身汉找女朋友。你不能总想着去挑那个完美的,而是选一个差不多满足你的需要,然后好好和她过日子。

那我说说Golang的优势:

  • 强类型
  • 自带GC
  • 性能约等于Java
  • 社区不错,常用组件都能找到。热度还不错
  • 静态链接
  • 擅长高并发,不错的协程模型
  • 谷歌爸爸
  • 代码简练,如果不以行数作KPI的话
  • 编译超快
  • 函数多返回值

当你深入学习后,会发现Golang是一个C的超集,(注意,不是C++,因为C++相对于C引以为傲的特性他爱理不理)而不是另一个版本的C#/Java。它替代了原生C中那些繁琐重复的内存管理,还有优化了多任务。恩,还优化了语法与包引用。如果你能写好C,写Go也不会转思路很多。也许是这样的语言特性,让他在性能方面很有底气。

为什么不是Golang

学习之前,还得先敲敲退堂鼓。如果鼓响完,还没有想放弃,那就开始吧。

0,在大多数情况下,go只适合写服务器后端程序。

如果你想一门语言有多种应用场景,兼容不同的需求又不需要来回重新学习新的语言。Java可以,C#可以,C++也可以,但是Go不在其列。在目标驱动下,你会发现golang不是不可替代的,它只是在有的方面做得更好,并不表示它独占了全栈开发技术树中的一个生态位。在下决心学习前,要充分衡量投入与产出,毕竟,新东西不是拿来就能用的,很多坑要踩过一圈才能开发成熟有用的产品。

1,全新语法。

Golang语法参考了java/C/python,但又脱胎于它们。当你掌握了几种语言后再来学习Go。一方面需要更多的时间熟悉新的语法,另一方面写的时候那些与别的语言有点像又不一样的关键词、方法名会让人颇为精神分裂。

2,逼死处女座外其它星座的语法规范

import 的包中内容必须被使用到,不然报错。

赋值过的变量必须使用,不然报错。

大括号前半必须跟在语句后,比如以下代码,不然报错。(旧C++用户受到了1万点暴击,Java用户略松口气)

// 正确写法
func test() {
   fmt.Println("Hello, World!")
}

// 报错写法
func test()
{
    fmt.Println("Hello, World!")
}

有一种,“豆腐脑必须是甜的,你要想有一种咸豆腐脑那就滚” 的不讲人情面的武断。

3,减掉了不少别的语言中常见的东西。

比如类(Go有一套自己的实现逻辑),习惯用Class关键字编织自己的代码结构的人看到Go的设计也许会有点不适应。

比如大家都早就习惯的抛出异常的方式,GO的表现是一种被大家吐槽很多的,布满代码调用的恶心Snippet。

if err != nil {
  return nil, err
}

4++,接下来的槽点就是深水区了,初学者也许一时不会遇到。也许在下一个版本,就更新补全了。比如对于泛型的支持,比如goroutine的控制与物理CPU关系不太可控。比如现有的Go下的网络框架对于一个只需要CRUD的API服务器程序没有Python Flask/FastAPI或是SpringBoot那么舒服。。。。

好了,如果你还继续想学Go,我们可以从安装一个环境开始做起。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注