简单对比一下 C 与 Go 两种语言

使用一个简单的计数程序将古老的 C 语言与现代 Go 进行比较。
在这里插入图片描述
Go 是一种现代编程语言,追溯其历史大部分源自编程语言 C。所以,任何熟悉 C 语言的开发者都可能会觉得 Go 很熟悉。C 程序员使用 Go 编写新程序变得容易,同时避免了 C 编程语言的许多常见缺陷。
下面通过实现一个简单的加法逻辑,来比较 C 和 GO 的区别。该程序将数字从一加到十,计算过程和结果数值都比较小,所以代码仅使用普通整数变量。像这样的循环逻辑在编程中很常见,所以对比效果会显而易见。

C 语言做循环

C 语言中的基本循环是 for 循环,它可以实现对一组值的迭代访问。

for 基本语法:

for (初始化条件; 判断条件为真; 每次循环之后的操作) {// do something;
}

比如,可以编写一个循环,初始化条件时设置变量 count 为 1,然后判断 count <= 10 为真时执行 {} 内的语句,在再次执行条件判断之前,对变量 count 增加 1。直到判断 count <= 10 为假就退出循环。
在每次迭代后,对变量 count 增加 1,除了常规的 count = count + 1 书写格式之外,也可以对变量采用 ++ 的自加操作符,这种变通可以使得代码更简洁易读。
在循环内部,为了直观查看变量的变化过程,可以使用标准库函数 printf 打印变量 count 的值:

for (int count = 1; count <= 10; count ++) {printf("%d\n", count);
}

为了演示完整的逻辑,下面是一个示例程序,将数字从 1 加到 10,然后打印和的结果。

#include <stdio.h>
int main()
{puts("adding 1 to 10 ..");int sum = 0;for (int count = 1; count <= 10; count ++) {sum += count;}printf("sum is %d\n", sum);return 0;
}

上面的代码使用了两种函数把信息打印出来,最终输出到标准输出 stdout。puts 函数打印一个字符串,直到遇到字符串的空字符,而 printf 函数支持格式化打印,非常灵活,所以更常用。关键字 %d 表示打印一个十进制(或整数)值,\n 表示换行符。
如果编译并运行该程序,你将看到以下输出:

adding 1 to 10 ..
sum is 55

GO 语言做循环

在 GO 语言中,同样提供了 for 循环,而且与 C 语言中的 for 循环语法非常相似,甚至可以直接转换成 GO 的书写格式。

下面为了直观查看变量的变化过程,在循环内部同样使用方法打印变量 count 的值:

var count int
for count = 1; count <= 10; count ++ {fmt.Printf("%d\n", count)
}

fmt 是包名,使用包之前需要先导入,用关键词 import。C 语言中就没有导入包的概念,只能通过包含头文件 .h 来引入其它现成模块。

fmt 实现了类似 C 语言的打印输出 printf 和读取输入 scanf。fmt.Printf 方法也是支持格式化输出的,甚至格式变量就是从 C 语言的 printf 派生而来。

在 C/C ++ 代码中,比较推荐的编码规范中通常每行是只写一句操作语句,虽然语法上多个操作语句是允许书写在同一行的,但这样易读性就很差。有没有发现,在每行 GO 语句的末尾都没有分号 ‘;’ 了? 因为 GO 编译器默认每行就是一个语句,这样其实是强制提高了代码的可读性。

再来看看 GO 语言实现的完整逻辑,基于上面的 C 语言代码版本直接翻译如下

package main
import "fmt"func main() {var sum, count intfmt.Println("adding 1 to 10 ..")for count = 1; count <= 10; count ++ {sum = sum + count}fmt.Printf("sum is %d\n", sum)
}

上面的代码是有效和可以正确运行输出的,但是这很不 GO ! GO 不单单是一门语言,也是一种态度。
有没有看到 C 语言版本中, for 循环里的初始化条件是可以同时声明定义并赋值变量的?换成在 GO 中是否也支持类似操作?
在 GO 中,有个声明变量并赋值的操作符 :=,就可以做到

for count := 1; count <= 10; count ++ {sum = sum + count
}

另外,你如果再细心一点可能会发现,GO 代码里声明定义的变量会被默认初始化为 0,而 C 代码中定义的变量如果未经初始化会是任何未知的值,如此看来 GO 的安全性有了很大的提高。
变量的生命周期管理对开发者来说是很耗费心智的,所以很多时候变量的声明定义都是应该尽量靠近使用的地方,并且缩窄变量的生命周期,对于事故的发生可以有效缩小排查错误的范围,简直就是在打救程序员的生命啊。
再来看看,优化后的 GO 范式代码

package main
import "fmt"func main() {fmt.Println("adding 1 to 10 ..")var sum intfor count := 1; count <= 10; count++ {sum += count}fmt.Printf("sum is %d\n", sum)
}

看到这里,和 C 代码的 main 函数比起来,GO 的 main 函数没有显式的返回值。实际上,GO 的 main 函数默认返回值 0,如果需要返回其它值,可以调用 os.Exit(n) 返回值 n,这个方法可在任何位置调用,程序会在调用该方法后会终止运行并退出,就类似 C 语言中的标准库函数 exit(n) 一样。

简单回顾

从上面的逻辑实现过程来看,两种语言实现过程差别不大,语法上是有差别的,书写的习惯其实就透露着各自的态度。
虽然老气横秋的 C 语言代码很多,但是如果按照现代 C 语言书写规范来看,GO 的代码是何其相似。
虽然你会说新出来的语言有很多方便到爆炸的语法糖。但问题是,语言的精髓是语法糖吗?答案不唯一,酸甜苦辣唯有尝过的人才知道。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/98497.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阶段五-Day03-Ajax

一、JavaWeb中路径的说明 1. JavaWeb中的路径 在JavaWeb中, 路径分为相对路劲和绝对路径两种: 相对路径: ./ 表示当前目录 ../ 表示当前文件所在目录的上一级目录 绝对路径: 完整的路径名 2. 在JavaWeb中/的不同意义 /斜杠如果被浏览器解析,得到的是 协议本地ip端口号…

第十二章:泛型(Generic)

1&#xff1a;为什么要有泛型&#xff1f; 泛型&#xff1a;&#xff08;标签&#xff09;允许在定义类、接口时候通过一个标识来表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型、参数将在使用时&#xff08;例如&#xff1a;继承或实现这个接口&#xff0…

QML 带框最大化显示方法

1.QML窗口最大化很多会给出如下方法: visibility: "FullScreen" 此方法不好的方面是没有最大化&#xff0c;最小化&#xff0c;关闭按钮 2.通过showMaximized() 方法可以满足我们需求:在onCompleted 方法中执行 实现的效果如下:

QT基础入门——界面布局和常用控件(四)

前言&#xff1a; 所谓 GUI 界面&#xff0c;归根结底&#xff0c;就是一堆组件的叠加。我们创建一个窗口&#xff0c;把按钮放上面&#xff0c;把图标放上面&#xff0c;这样就成了一个界面。在放置时&#xff0c;组件的位置尤其重要。我们必须要指定组件放在哪里&#xff0c…

妙鸭相机功能代码复现

妙鸭相机功能代码复现 妙鸭相机主要实现人脸替换与人脸高清增强修复功能。可通过两种方式实现Roop和Lora模型。 RooP笔记 基础模型:inswapper_128.onnx 人脸分析模型:insightface 高清增强模型:gfpgan 大体流程为通过insightface检测出人脸,替换人脸,使用gfpgan对人…

设计模式——14. 观察者模式

1. 说明 观察者模式(Observer Pattern)是一种行为型设计模式,用于定义对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都能够自动收到通知并更新自己的状态,以保持与被观察对象的同步。观察者模式也被称为发布-订阅模式。 观察者模式包含…

改变世界-生成式人工智能

麦肯锡在其《生成人工智能的经济潜力&#xff1a;下一个生产力前沿》中声称&#xff0c;“ChatGPT、GitHub Copilot、Stable Diffusion 等生成式人工智能应用程序以 AlphaGo 没有的方式吸引了世界各地人们的想象力&#xff0c;这要归功于它们广泛的实用性——几乎任何人都可以使…

Java中的Iterator

Java中的Iterator Iterator 是Java中的一个接口&#xff0c;它提供了一种访问集合&#xff08;如列表、集合等&#xff09;中元素的标准方式。Iterator 具有一些特点、优点和缺点&#xff0c;下面详细介绍如何使用它以及相关信息。 使用Iterator&#xff1a; 创建Iterator&am…

动态代理初步了解

准备案例 需求 模拟某企业用户管理业务&#xff0c;需包含用户登录&#xff0c;用户删除&#xff0c;用户查询功能&#xff0c;并要统计每个功能的耗时。 分析与实现 定义一个UserService表示用户业务接口&#xff0c;规定必须完成用户登录&#xff0c;用户删除&#xff0c…

2019年[海淀区赛 第2题] 阶乘

题目描述 n的阶乘定义为n!n*(n -1)* (n - 2)* ...* 1。n的双阶乘定义为n!!n*(n -2)* (n -4)* ...* 2或n!!n(n - 2)*(n - 4)* ...* 1取决于n的奇偶性&#xff0c;但是阶乘的增长速度太快了&#xff0c;所以我们现在只想知道n!和n!!末尾的的个数 输入格式 一个正整数n &#xff…

华为OD七日集训第7期 - 按算法分类,由易到难,循序渐进,玩转OD

目录 一、适合人群二、本期训练时间三、如何参加四、7日集训第7期五、精心挑选21道高频100分经典题目&#xff0c;作为入门。第1天、逻辑分析第2天、字符串处理第3天、数据结构第4天、递归回溯第5天、二分查找第6天、深度优先搜索dfs算法第7天、动态规划 六、集训总结 大家好&a…

基于Stable Diffusion的图像合成数据集

当前从文本输入生成合成图像的模型不仅能够生成非常逼真的照片&#xff0c;而且还能够处理大量不同的对象。 在论文“评估使用稳定扩散生成的合成图像数据集”中&#xff0c;我们使用“稳定扩散”模型来研究哪些对象和类型表现得如此逼真&#xff0c;以便后续图像分类正确地分配…

【C++】Stack Queue -- 详解

一、stack的介绍和使用 1、stack的介绍 https://cplusplus.com/reference/stack/stack/?kwstack 1. stack 是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。 2. stack 是作为容器适配器被…

Docker Mysql实战:docker compose 搭建Mysql

1、docker-compose-mysql文件准备 进入/home/docker目录&#xff0c;新建docker-compose-mysql.yml文件&#xff0c;内容如下&#xff1a; version: 3.0 services:mysql:image: "mysql:5.7"container_name: "mysql"environment:MYSQL_ROOT_PASSWORD: &q…

linux中命令行如何使用git

在Linux中&#xff0c;您可以使用命令行来使用Git版本控制系统。以下是一些常见的Git命令&#xff0c;用于在Linux终端中进行版本控制&#xff1a; 安装Git&#xff1a;如果您的Linux系统上还没有安装Git&#xff0c;可以使用适合您的包管理器来安装它。例如&#xff0c;在Ubu…

Java中树形菜单的实现方式(超全详解!)

前言 这篇文中&#xff0c;我一共会用两种方式来实现目录树的数据结构&#xff0c;两种写法逻辑是一样的&#xff0c;只是一种适合新手理解&#xff0c;一种看着简单明了但是对于小白不是很好理解。在这里我会很详细的讲解每一步代码&#xff0c;主要是方便新人看懂&#xff0…

从0开始python学习-31.selenium 文本输入框、下拉选择框、文件上传、时间插件选择元素定位

目录 1. 纯文本输入框 2. 存在默认值的文本输入 3. 下拉选择框 4. 输入后下拉选择框 5. 文件上传 6. 时间插件 1. 纯文本输入框 driver.find_element(By.XPATH,/html/body/div[2]/td[2]/input).send_keys(测试名称) 2. 存在默认值的文本输入 注意&#xff1a; 1. 这种存…

AQS内部的体系架构

AQS本质上是一个双向队列&#xff0c;加一个状态位state。内部靠Node节点形成队列。 AQS由state和CLH变体的虚拟双端队列组成。 AQS的内部类Node类 属性说明&#xff1a; 内部结构&#xff1a;

合并K个已排序的链表

题目 链接 描述 合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。 示例1 输入&#xff1a; [{1,2,3},{4,5,6,7}] 返回值&#xff1a; {1,2,3,4,5,6,7} 示例2 输入&#xff1a; [{1,2},{1,4,5},{6}] 返回值&#xff1a; {1,1,2,4,5,6} 题解&#xff08;合并&…

上门按摩小程序|同城上门按摩软件开发|上门按摩系统;

上门按摩小程序的开发具有许多优势&#xff0c;下面就给大家介绍下按摩小程序功能: 上门按摩小程序的优势 方便快捷&#xff1a;上门按摩小程序提供在线预约服务&#xff0c;用户可以通过手机随时随地预约按摩师上门服务&#xff0c;避免了传统预约方式的繁琐和不确定性。 个性…