golang与C语言相比最重要的改进是什么?
一、golang与C语言相比最重要的改进是什么
1.内存管理
Golang在C语言的基础上添加了内存管理机制,这使得C语言开发中让人头大的各种内存问题得以解决。Golang初始的几个版本内存管理机制被人诟病,垃圾回收会导致程序停顿,但是现在Golang的内存管理已经相当完善。然而,Golang提供内存管理机制的同时。依然保留了C语言的指针变量类型,这是为什么?
Golang对普通变量采用复制的方式进行使用,而指针是将原始对象的地址进行传递,例如函数传参,普通变量会进行形参向实参的拷贝,函数内部对实参的修改不会影响到函数外的变量,而指针变量只是传递地址,函数内部对实参的修改会直接改变函数外的变量。
保留C语言这一概念,为我们的编程带来了极大地灵活性,C语言编程中有一条简单的规则,如果是基本类型(int,float等)建议使用变量,除非需要对变量进行修改;如果使用复合类型(结构体等),如果不是需要深拷贝的场合,建议使用指针,因为这些类型的变量一般占用内存空间比较大,如果使用变量,会多次复制,影响程序性能。Golang保留了这一概念,就让我们可以按照自己的需要选择合适的方式——使用变量还是指针,代码设计的灵活性更大,改善代码性能的方式也更简单。
2.语句的简洁性
Golang的语句比C语言更加简洁,如定义并初始化变量,
C语言中
int a = 0;
Golang中
a := 0
除了不需要分号,a变量之前未定义,使用:=进行赋值,就是定义变量a且赋值为0,至于a的数据类型,Golang进行了自动推断,由于我们使用整形0进行赋值,所以a就是整形的变量。
3.不使用动态链接库
Golang不支持动态链接库,Golang编译只会生成一个对应的可执行文件,引用第三方包,使用go get直接拉取源码并统一编译。带来的好处就是Golang的项目部署极其简单,可执行文件只有一个,配置好配置文件,资源安排好,直接运行即可。
4.具备包体系
Golang引入了包体系,更方便代码结构的控制和引用第三方资源。C语言没有包的概念,所以之前文章提到,我们需要自己组织好代码的位置,防止概念混乱。
5.面向对象
Golang可以进行面向对象编程,Golang在面向对象方面采取了和C++,Python等相同的理念,Golang提供了面向对象的机制,但是也可以面向过程编程,Golang不限制你使用的编程思想。
Golang的面向对象语法非常简单,派生采用了Has-a的方式,没有提供Is-a的方式,这有两方面原因,一方面,在C语言中,如果进行派生,我们采用一个结构体包含另一个结构体的方式,也就是只能采用Has-a的方式;另外,Is-a的派生方式经常存在问题,如果父类的接口发生变化,经常会直接影响子类的接口也要进行调整,Has-a的方式,父类作为子类的成员变量存在,父类相当于封装在自己的类定义下,代码的变异不容易扩散。
Golang提供了interface,这也是C语言没有的。另外Golang的interface更加易用,不需要显式指定一个类实现了哪个interface,只要是一个类实现了interface中的所有方法,他就可以被认为是这个interface的实现。
至于封装,很简单,首字母大写的全局变量,方法和全局函数是公有的,而首字母小写的全局变量,方法和全局函数是包内可访问的。
延伸阅读:
二、golang丰富的标准库和第三方资源
Golang的标准库十分强大,甚至于包含了Web开发的接口,模板等等,这些都是C语言不可比拟的,经过几年的发展,Golang也拥有了大量的使用人群,所以第三方资源日趋丰富和完善。
以上就是Golang在C基础上的一些进步,总的说来,经过一段时间对Golang的使用,感受非常好。从Golang可以看到很多C语言的影子,但是很多C开发时作为编码规范和思想的东西,在Golang中已经将其作为语法进行了规范和限制,减少了编码时需要考虑的问题量,同时保留了C语言的灵活性,Golang丰富的标准库和第三方资源,增加了使用Golang进行开发的手段。
但是,不得不承认,Golang不适合作为入门级的编程语言,Golang中语法的很多闪光点,需要结合多种编程语言的对比才能发现,如果你有丰富的编程经验,使用Golang时会发现,当时关注的编码问题,Golang都已经考虑到了,这时你会感叹Golang的设计。毕竟作为新生代的编程语言主力,不应该再出现老一辈语言的问题了,取长补短,正是Golang应该做的。

猜你喜欢LIKE
相关推荐HOT
更多>>
跳跃链表的构建思路是什么?
一、跳跃链表的构建思路跳表一般基于有序链表实现。首先是链表的排序问题,对于链表的来说,排序的问题其实等价于怎么找到新增节点的在有序链表...详情>>
2023-10-11 20:54:19
为什么二叉堆只能删除堆顶元素?
一、二叉堆只能删除堆顶元素的原因1、二叉堆的结构特性二叉堆是一种完全二叉树(或近似完全二叉树),节点从上到下、从左到右依次排列,不会出...详情>>
2023-10-11 20:16:26
为什么JavaScript绝大多数内置函数都是native code?
一、JavaScript绝大多数内置函数都是native code的原因1、提高程序执行效率首先,内置函数作为引擎内部的一部分,可以提高JavaScript程序的执行...详情>>
2023-10-11 19:07:07
敏捷开发怎么落地?
一、敏捷开发落地在敏捷开发落地的过程中,我们通常会采用 Scrum 的方式,所以我们以 Scrum 为例来为大家介绍敏捷开发的流程和场景,在这个过程...详情>>
2023-10-11 16:58:54热门推荐
Java里float在乘以5之后为什么会出现很多小数?
沸bug管理工具有哪几个?
热「AVL旋转」存在的目的是什么?
热常用的数据库管理系统有哪些?
新为什么sql数据库用B树索引,而不是用其他树型数据结构?
为什么说双端队列比栈和队列灵活,但实际却没有后两者有用?
跳跃链表的构建思路是什么?
广义表和树有什么区别?
为什么二叉堆只能删除堆顶元素?
为什么Java提供了多种数据结构而python和go没有?
计算机组成原理、数据结构、编译原理都是什么?
为什么JavaScript绝大多数内置函数都是native code?
wiki怎么建?
软件测试怎么写测试用例?
技术干货






