10年程序员的编程语言感受与Go的结缘

待兔 等级 1091 0 0

因为小编最近在写两套教程,分别是Java语言基础教程和Go语言的基础教程,并且这 2 门语言,小编在实际的工作中也都有用过

而且 www.helloworld.net 社区的后台,就是用Go语言写的,而且正是小编负责的。况且小编在工作中是用Java的。

所以对这两门语言还算比较了解,所以本文对这 2 种语言聊聊小编自己的感受与看法

,也顺便聊聊小编这10年来,各种编程语言的一些感受

本文观点仅仅代表自己,仅供参考

不希望引起语言好与坏之争。

小编的C++开发经历

最初小编我刚毕业的时候,是做C/C++开发的 , 主要是研发 Windows 桌面软件。用过微软的 MFCWTL也用过 Qt跨平台的框架

了解过 C++桌面软件开发的人都知道 ,C++写界面,是非常痛苦的,没有好用的界面库,MFC丑陋,复杂,WTL 只是界面框架

但是也很难实现漂亮的界面,后来也接触过 Qt 以及自绘的UI框架,总得来说,C++开发桌面客户端软件,真的没有前端爽,很痛苦。

导致你整天想着这个按钮怎么实现,那个编辑框文本怎么垂直居中,而不是把重心放在业务上。总之,吃力不讨好。

况且C++不光是画界面没有其它端(比如前端,安卓,IOS)容易,连常用的库也没有他们的全。很多还要造轮子。

甚至每个C++开发工程师都有自己一套字符串操作的工具类,而Java中,一个 String 类全部搞定了。

做了 3 年的C++开发,但是随着后来安卓手机的兴起,越来越多的软件开始有了安卓版本,安卓当时也越来越火了。

想到C++桌面软件开发有可能会落寞,所以,在同学(安卓开发)的帮助下,小编转行开始了 安卓开发的生涯。

小编的Android开发经历

因为大学是计算机专业,在大学里面学过C/C++, 也学过 Java ,所以,转行做安卓,也不是太难。甚至有点惊讶的感觉。

记得有一件事记忆特别深,之前做C++开发的时候, 解析 json 串,忘了当时用的一个什么库了,只是记得解析的时候,

需要手动一个key一个 key 的去解析,获取值。

做安卓开发的时候,同学当时告诉我有一个 Gson 库,可以直接把 json 串转成对应的类,也可以直接把类转成 字符串

当时看到这感觉用Java写东西太爽了,库那么多,很多事都不用操心 ,C++转安卓后,写Java那叫一个爽

感觉从原始的刀耕火种时代,到了现代时代 。

转眼间,开发安卓也有了6,7年了,Java现在用的,不说是专家吧,至少也算是个高级水平吧,随着Java语言的深入

也慢慢觉得Java虽好,但是也有一些不太好的地方了。

比如Java语言太啰嗦,现代的语言,比如 dart,go, swift,这些出现的较晚的,都是简单化了。

语法简单,写起来也舒服。Java 虽然在Java 10也有了 var 关键字,定义变量不用再写又臭又长的一大堆了,但是现在用的最多的还是 Java8

还有Java的虚拟机,导致特别的消耗资源 。

比如 Java 的 Spring 那一整套解决方案,有人戏称是配置工程师,想要什么功能,只需要在配置一下就行了。(前提是你得记得住怎么配置或者知道怎么搜索)

可见 Java Spring 这套有多成熟 ,但是也带来了,黑箱操作,很多人只知道配置,不懂得其中的原理

编译出来的是什么?是一个可执行文件吗?是可以 jar 包吗? 监听的 ip地址和 端口 是在哪里写的?main 函数在哪?

很多初级的甚至做了5,6年 Java 的人(主要用 Spring的),并不清楚这里面的原理

当时Java的好处也是非常的多,Spring 那一套提供了一篮子解决方案,用来企业级开发,最稳定不过

国内的阿里,JD等公司,都是在大规模的用 SpringSpring几乎成了Java的代名词了

那小公司更不用说了,只要选择Java开发,99%的都会选择 Spring了

当然小编是做Android开发的,并不是做Web 开发的

后来接触 web开发,也是因为要做一个 开发者专属的技术社区,也就是本文刚开始提到的网站 www.helloworld.net

由此小编和后来的 Go语言有了交集

小编和Go语言的开发经历

说到Go语言,不得不提HelloWorld开发者社区(www.helloworld.net) , 当初是在2018年,有了做一个开发者专属的技术社区的想法

技术选型的时候,首先要决定的是,后台到底是用什么语言写?用什么框架写?

Java写,用 SpringBoot 那一套,事实上这一套对我很有吸引力。至少以后有什么问题,这一套都有对应的技术方案。

但是同时,也在网上搜一些Go语言相关的文章 ,因为之前业余的时间了解过Go语言,所以知道Go语言有一些很棒的特性。

比如:语法简洁,函数返回多值,天生支持并发,使用通道进行多个协程之间的同步和同信,丰富的网络编程接口

当然还有人诟病Go没有泛型,其实这一点吧,小编个人认为这是一个优点,因为小编在做C++的时候,泛型真的很难理解,泛型写出来的代码

也真的很晦涩难懂,尤其是 STL 中的源码。

到了Java中,泛型虽然比C++中的简单了点,但是还是太难理解,所以小编宁愿多写几个函数,也不想要泛型,因为这玩意太费脑子了。

说了费脑子,小编了解到 swift 语言,把 ++ 操作符给废除了。因为 ++ 可以用在前面++i ,也可以用在后面i++ ,而且意义还不一样

所以啊,一个编程语言,主要看背后设计的思想,swift就认为这种 前加加, 后加加, 没有必要,干嘛要费劲的去区分他们的区别呢

所以在 swift 中,只能使用 i = i + 1 这种方式(低版本的 swift 还是有 ++ 操作符的),我觉得这种解放心智的设计是好的。

因为前加加,后加加,区分得开,区分不开,反应不出啥,啥都反应不出来。

要跑题了,说到 www.helloworld.net 开发者社区, 最后各种资料学习Go, 也接触到了 gin , iris 等框架, 至少用 go 写web 程序

语言本身就支持的,就提供了一接口,net 包中提供了相当丰富的接口,用来写 web ,而且 gin ,iris 这些web框架,封装的也不是很深

这正是我所需要的:不想要那种封装的太深的东西,只靠配置,让我不知道里面的具体原理流程

但是又不想要那种最原始的,什么都不封装,我觉得 gin , iris 正是我需要的这种框架。

还有一个原因,就是,Go语言编译出来的,只有一个可执行文件 ,扔到服务器上就能跑起来,提供服务了

连 nginx 这种都不用安装 。就直接提供80服务了,这个相于对 Java, 服务器上几乎 什么都 不用安装

编译出来一个可执行文件,命令行执行,就OK了,这个对运维太友好了。不用安装 tomcat ,不用安装 JDK ,不用配置环境,不用安装nginx

这一点也是最吸引我的地方

还有就是,Go语言开发的效率相当的高,性能也很高,被称为 21 世纪的 C 语言

所以最终,还是选择了 Go ,作为 www.helloworld.net开发者社区的后台语言

Java和Go的比较

这种话题最容易引起语言的好坏之争,因为本身程序员手里都有一种用的非常熟练的工具,比如有的人用JAVA很多年了,用的很顺手了

比如有的人只接触过 Go ,就一直说Go的各种好。事实上这些是不公平的。至少你要2种语言都用过,都有过实际的项目经验。

才能更公正一点,事实上,语言是分好坏的。这个小编认为是存在的。

Java与Go ,现在的争论很多,Java 二十多年的历史了,各种框架,库,解决方案非常的成熟,而且性能不差

是现在很多企业的首选语言,但是也不否认Java存在的一些问题,而这些问题,在Go里面,可能就没有。

Go语言,Google大力推广的,内部也在使用的,它的出现,必然是因为解决一些问题而出的

但是出来的较晚,各种库,解决方案没有Java的丰富。

所以,现在这两种语言谁也代替不了谁。但是小编个人认为,未来在服务端编程方面,一定是Go的未来

现在的JavaGo语言之争,就像当年的 JavaPHP之争一样

历史总是惊人的相似,时间会回答一切。我们安静的见证就好。

至少在现在,会这两种语言之中的任何一种,都是不缺少工作的。

C++到 Java,再到 Go, 有什么感受

作为过来人,可能第一感觉就是,C++ 吃力不讨好,可能C++Java,前端,安卓同样的工资待遇,但是干 C++的心更累

Java真的很不错,优等生,有时候找不出什么出挑的毛病。有一些不太好的地方,但都不是实质性问题

Go 我是真的很喜欢,写过Go的人,都会有这样一种感受吧,这语言写起来要爽一点,但是Go的第三方库,还是要再丰富一点才好

这10年的开发经历,从 c++, java, go ,也写过一段时间的前端(vue) ,中间创业过一年,写过一年的PHP

总得来说,语言只是工具,能正确使用工具,解决问题就好

但是解决同一种问题,有多种工具时,这里面就有好有坏了,有取有舍了,个中选择,懂的人自然懂

如果你是一个学生,如果你刚工作,如果你是做后端的,建议你一定要看看Go语言

如果你是一个工作多年的人了,相信哪种语言对你来说也不太重要了

收藏
评论区

相关推荐

Golang中常用的字符串操作
Golang中常用的字符串操作 一、标准库相关的Package go import( "strings" ) 二、常用字符串操作 1. 判断是否为空字符串 1.1 使用“”进行判断 思路:直接判断是否等于""空字符串,由于Golang中字符串不能为 nil,且为值类型,所以直接与空字符串比较即可。 举例: go
go语言中,数组与切片的区别?
切片是Go 语言核心的数据结构,然而刚接触 Go 的程序员经常在切片的工作方式和行为表现上被绊倒。比如,明明说切片是引用类型但在函数内对其做的更改有时候却保留不下来,有时候却可以。究其原因是因为我们很多人用其他语言的思维来尝试猜测 Go 语言中切片的行为,切片这个内置类型在 Go 语言底层有其单独的类型定义,而不是我们通常理解的其他语言中数组的概念。 文章
Go语言开发的利与弊
Go 语言有多火爆?国外如 Google、AWS、Cloudflare、CoreOS 等,国内如七牛、阿里等都已经开始大规模使用 Go 语言开发其云计算相关产品。在 Go 语言的使用过程中,需要注意哪些 Yes 和 But? 最近,我们使用 Go 语言编写了一个 API,Go 语言是一种开源编程语言,2009 年由 Google 推出。在使用 Go 进行开
go-map源码简单分析(map遍历为什么时随机的)
GO 中map的底层是如何实现的 首先Go 语言采用的是哈希查找表,并且使用链表解决哈希冲突。 GO的内存模型 先看这一张map原理图 (https://imghelloworld.osscnbeijing.aliyuncs.com/49dfa7b81e19fbab143ddc0a7b3b7fa0.png) map 再来看
我的golang笔记
面向对象思想 面向对象简介 编程思想 与编程语言无关。 C语言、Go中的 结构体 就是后来面向对象编程语言中的类。 面向对象编程:高内聚,低耦合。 特性 继承 —— 匿名字段(实名字段) 封装 —— 方法 多态 —— 接口(interface) Go 语言是典型的面向对象编程语言。 通过程序描述对象 创建类(指定类属性) 类属性:静
go的三个运行基本命令的区别,go run ,go build 和 go install
最近在自学go,遇到点基础的问题,通过自己实际操作之后得出结论在实际操作之前,我们需要知道go有三种源码文件:      1,命令源码文件;声明自己属于main包,并且包含main函数的文件,每个项目只能有一个这样的文件,即程序的入口文件      2,库源码文件;不能直接被执行的源码文件      3,测试源码文件本次操作不涉及测试源码文件。go run
Dart中的泛型、泛型方法、泛型类、泛型接口
一、Dart中的泛型 泛型方法 通俗理解:泛型就是解决 类 接口 方法的复用性、以及对不特定数据类型的支持(类型校验) 一般用   T   表示泛型 getData<T(T value){ return
[concurrent-map]-并发map在go中的使用
关于我 通过学习和分享的过程,将自己工作中的问题和技术总结输出,希望菜鸟和老鸟都能通过自己的文章收获新的知识,并付诸实施。 引言Go语言原生的map类型并不支持并发读写。在Go 1.9之前,go语言标准库中并没有实现并发map。在Go 1.9中,引入了sync.Map。 concurrentmap的优势concurrentm
一篇文章彻底弄懂理解和高效运用切片(slice)
slice,中文多译为“切片”,是 Go 语言在数组之上提供的一个重要的抽象数据类型。在 Go 语言中,绝大多数需要使用数组的场合,切片都实现了完美替代。并且和数组相比,切片提供了更通用、功能更强大且便捷的数据序列访问接口。 1. 切片究竟是什么在对切片一探究竟之前,我们先来简略了解一下 Go 语言中的数组。Go 语言数组是一个固定长度的、容纳同构类型元素的
一篇文章彻底弄懂go语言方法的本质
Go 语言不支持经典的面向对象语法元素,比如:类、对象、继承等。但 Go 语言也有方法(method)。和函数相比,Go 语言中的方法在声明形式上仅仅多了一个参数,Go 称之为 receiver 参数。而 receiver 参数正是方法与类型之间的纽带。Go 方法的一般声明形式如下:gofunc (receiver T/T) MethodName(参数列表)
go语言定义“零值可用”的类型
1. Go 类型的零值作为 C 程序员出身的我,我总是喜欢用在使用 C 语言的”受过的苦“与 Go 语言中得到的”甜头“做比较,从而来证明 Go 语言设计者在当初设计 Go 语言时是做了充分考量的。在 C99 规范中,有一段是否对栈上局部变量进行自动清零初始化的描述: 如果未显式初始化且具有自动存储持续时间的对象,则其值是不确定的。规范的用语总是晦涩难懂的。
go语言 init 函数的妙用
从程序逻辑结构角度来看,Go 包(package)是程序逻辑封装的基本单元,每个包都可以理解为一个”自治“的、封装良好的、对外部暴露有限接口的基本单元。一个 Go 程序就是由一组包组成的。在 Go 包这一基本单元中分布着常量、包级变量、函数、类型和类型方法、接口等,我们要保证包内部的这些元素在被使用之前处于合理有效的初始状态,尤其是包级变量。在 Go 语言中
理解go语言包导入路径的含义
Go 语言是使用包(package)作为基本单元来组织源码的,可以说一个 Go 程序就是由一些包链接在一起构建而成的。虽然与 Java、Python 等语言相比这算不上什么创新,但与祖辈 C 语言的头文件包含机制相比则是“先进”了许多。编译速度快是这种”先进性“的一个突出表现,即便是每次编译都是从零开始。Go 语言的这种以包为基本构建单元的构建模型使得依赖分
10年程序员的编程语言感受与Go的结缘
因为小编最近在写两套教程,分别是Java语言基础教程和Go语言的基础教程,并且这 2 门语言,小编在实际的工作中也都有用过而且 www.helloworld.net 社区的后台,就是用Go语言写的,而且正是小编负责的。况且小编在工作中是用Java的。所以对这两门语言还算比较了解,所以本文对这 2 种语言聊聊小编自己的感受与看法,也顺便聊聊小编这10年来,各种
JAVA回调机制(CallBack)之小红是怎样买到房子的??
JAVA回调机制CallBack 序言最近学习java,接触到了回调机制(CallBack)。初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义。当然了,我在理解了回调之后,再去看网上的各种讲解,确实没什么问题。但是,对于初学的我来说,缺了一个循序渐进的过程。此处,将我对回调机制的个人理解,按