微山网站建设公司,去海南注册公司需要什么条件,莱芜论坛24小时主题帖,怎样做图片链接到网站使用一个简单的计数程序将古老的 C 语言与现代 Go 进行比较。 Go 是一种现代编程语言#xff0c;追溯其历史大部分源自编程语言 C。所以#xff0c;任何熟悉 C 语言的开发者都可能会觉得 Go 很熟悉。C 程序员使用 Go 编写新程序变得容易#xff0c;同时避免了 C 编程语言的… 使用一个简单的计数程序将古老的 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 55GO 语言做循环
在 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 fmtfunc 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 fmtfunc 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 的代码是何其相似。 虽然你会说新出来的语言有很多方便到爆炸的语法糖。但问题是语言的精髓是语法糖吗答案不唯一酸甜苦辣唯有尝过的人才知道。