簡(jiǎn)單對(duì)比一下?C語(yǔ)言?與?Go語(yǔ)言
Go 是一種現(xiàn)代編程語(yǔ)言,追溯其歷史大部分源自編程語(yǔ)言 C。所以,任何熟悉 C 語(yǔ)言的開發(fā)者都可能會(huì)覺得 Go 很熟悉。C 程序員使用 Go 編寫新程序變得容易,同時(shí)避免了 C 編程語(yǔ)言的許多常見缺陷。
下面通過實(shí)現(xiàn)一個(gè)簡(jiǎn)單的加法邏輯,來(lái)比較 C 和 GO 的區(qū)別。該程序?qū)?shù)字從一加到十,計(jì)算過程和結(jié)果數(shù)值都比較小,所以代碼僅使用普通整數(shù)變量。像這樣的循環(huán)邏輯在編程中很常見,所以對(duì)比效果會(huì)顯而易見。
C 語(yǔ)言做循環(huán)
C 語(yǔ)言中的基本循環(huán)是 for 循環(huán),它可以實(shí)現(xiàn)對(duì)一組值的迭代訪問。
for 基本語(yǔ)法:
for (初始化條件; 判斷條件為真; 每次循環(huán)之后的操作) { // do something; }
比如,可以編寫一個(gè)循環(huán),初始化條件時(shí)設(shè)置變量 count 為 1,然后判斷 count <= 10 為真時(shí)執(zhí)行 {} 內(nèi)的語(yǔ)句,在再次執(zhí)行條件判斷之前,對(duì)變量 count 增加 1。直到判斷 count <= 10 為假就退出循環(huán)。
在每次迭代后,對(duì)變量 count 增加 1,除了常規(guī)的 count = count + 1 書寫格式之外,也可以對(duì)變量采用 ++ 的自加操作符,這種變通可以使得代碼更簡(jiǎn)潔易讀。
在循環(huán)內(nèi)部,為了直觀查看變量的變化過程,可以使用標(biāo)準(zhǔn)庫(kù)函數(shù) printf 打印變量 count 的值:
for (int count = 1; count <= 10; count ++) { printf("%d\n", count); }
為了演示完整的邏輯,下面是一個(gè)示例程序,將數(shù)字從 1 加到 10,然后打印和的結(jié)果。
#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; }
上面的代碼使用了兩種函數(shù)把信息打印出來(lái),最終輸出到標(biāo)準(zhǔn)輸出 stdout。puts 函數(shù)打印一個(gè)字符串,直到遇到字符串的空字符,而 printf 函數(shù)支持格式化打印,非常靈活,所以更常用。關(guān)鍵字 %d 表示打印一個(gè)十進(jìn)制(或整數(shù))值,\n 表示換行符。
如果編譯并運(yùn)行該程序,你將看到以下輸出:
adding 1 to 10 ..
sum is 55
GO 語(yǔ)言做循環(huán)
在 GO 語(yǔ)言中,同樣提供了 for 循環(huán),而且與 C 語(yǔ)言中的 for 循環(huán)語(yǔ)法非常相似,甚至可以直接轉(zhuǎn)換成 GO 的書寫格式。
下面為了直觀查看變量的變化過程,在循環(huán)內(nèi)部同樣使用方法打印變量 count 的值:
var count int for count = 1; count <= 10; count ++ { fmt.Printf("%d\n", count) }
fmt 是包名,使用包之前需要先導(dǎo)入,用關(guān)鍵詞 import。C 語(yǔ)言中就沒有導(dǎo)入包的概念,只能通過包含頭文件 .h 來(lái)引入其它現(xiàn)成模塊。
fmt 實(shí)現(xiàn)了類似 C 語(yǔ)言的打印輸出 printf 和讀取輸入 scanf。fmt.Printf 方法也是支持格式化輸出的,甚至格式變量就是從 C 語(yǔ)言的 printf 派生而來(lái)。
在 C/C ++ 代碼中,比較推薦的編碼規(guī)范中通常每行是只寫一句操作語(yǔ)句,雖然語(yǔ)法上多個(gè)操作語(yǔ)句是允許書寫在同一行的,但這樣易讀性就很差。有沒有發(fā)現(xiàn),在每行 GO 語(yǔ)句的末尾都沒有分號(hào) ';' 了? 因?yàn)?GO 編譯器默認(rèn)每行就是一個(gè)語(yǔ)句,這樣其實(shí)是強(qiáng)制提高了代碼的可讀性。
再來(lái)看看 GO 語(yǔ)言實(shí)現(xiàn)的完整邏輯,基于上面的 C 語(yǔ)言代碼版本直接翻譯如下
package main import "fmt" func main() { var sum, count int fmt.Println("adding 1 to 10 ..") for count = 1; count <= 10; count ++ { sum = sum + count } fmt.Printf("sum is %d\n", sum) }
上面的代碼是有效和可以正確運(yùn)行輸出的,但是這很不 GO ! GO 不單單是一門語(yǔ)言,也是一種態(tài)度。
有沒有看到 C 語(yǔ)言版本中, for 循環(huán)里的初始化條件是可以同時(shí)聲明定義并賦值變量的?換成在 GO 中是否也支持類似操作?
在 GO 中,有個(gè)聲明變量并賦值的操作符 :=,就可以做到
for count := 1; count <= 10; count ++ { sum = sum + count }
另外,你如果再細(xì)心一點(diǎn)可能會(huì)發(fā)現(xiàn),GO 代碼里聲明定義的變量會(huì)被默認(rèn)初始化為 0,而 C 代碼中定義的變量如果未經(jīng)初始化會(huì)是任何未知的值,如此看來(lái) GO 的安全性有了很大的提高。
變量的生命周期管理對(duì)開發(fā)者來(lái)說是很耗費(fèi)心智的,所以很多時(shí)候變量的聲明定義都是應(yīng)該盡量靠近使用的地方,并且縮窄變量的生命周期,對(duì)于事故的發(fā)生可以有效縮小排查錯(cuò)誤的范圍,簡(jiǎn)直就是在打救程序員的生命啊。
再來(lái)看看,優(yōu)化后的 GO 范式代碼
package main import "fmt" func main() { fmt.Println("adding 1 to 10 ..") var sum int for count := 1; count <= 10; count++ { sum += count } fmt.Printf("sum is %d\n", sum) }
看到這里,和 C 代碼的 main 函數(shù)比起來(lái),GO 的 main 函數(shù)沒有顯式的返回值。實(shí)際上,GO 的 main 函數(shù)默認(rèn)返回值 0,如果需要返回其它值,可以調(diào)用 os.Exit(n) 返回值 n,這個(gè)方法可在任何位置調(diào)用,程序會(huì)在調(diào)用該方法后會(huì)終止運(yùn)行并退出,就類似 C 語(yǔ)言中的標(biāo)準(zhǔn)庫(kù)函數(shù) exit(n) 一樣。
簡(jiǎn)單回顧
從上面的邏輯實(shí)現(xiàn)過程來(lái)看,兩種語(yǔ)言實(shí)現(xiàn)過程差別不大,語(yǔ)法上是有差別的,書寫的習(xí)慣其實(shí)就透露著各自的態(tài)度。
雖然老氣橫秋的 C 語(yǔ)言代碼很多,但是如果按照現(xiàn)代 C 語(yǔ)言書寫規(guī)范來(lái)看,GO 的代碼是何其相似。
雖然你會(huì)說新出來(lái)的語(yǔ)言有很多方便到爆炸的語(yǔ)法糖。但問題是,語(yǔ)言的精髓是語(yǔ)法糖嗎?答案不唯一,酸甜苦辣唯有嘗過的人才知道。
到此這篇關(guān)于簡(jiǎn)單對(duì)比一下 C語(yǔ)言 與 Go語(yǔ)言的文章就介紹到這了,更多相關(guān)C語(yǔ)言 與 Go語(yǔ)言對(duì)比內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang 字符串與字節(jié)數(shù)組互轉(zhuǎn)的實(shí)現(xiàn)
在Go語(yǔ)言中,我們經(jīng)常在字符串和切片之間進(jìn)行轉(zhuǎn)換,本文就詳細(xì)的介紹一下Golang 字符串與字節(jié)數(shù)組互轉(zhuǎn)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02Go計(jì)算某段代碼運(yùn)行所耗時(shí)間簡(jiǎn)單實(shí)例
這篇文章主要給大家介紹了關(guān)于Go計(jì)算某段代碼運(yùn)行所耗時(shí)間的相關(guān)資料,主要介紹了Golang記錄計(jì)算函數(shù)執(zhí)行耗時(shí)、運(yùn)行時(shí)間的一個(gè)簡(jiǎn)單方法,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下2023-11-11Golang實(shí)現(xiàn)不被復(fù)制的結(jié)構(gòu)體的方法
sync包中的許多結(jié)構(gòu)都是不允許拷貝的,因?yàn)樗鼈冏陨泶鎯?chǔ)了一些狀態(tài)(比如等待者的數(shù)量),如果你嘗試復(fù)制這些結(jié)構(gòu)體,就會(huì)在你的?IDE中看到警告,那這是怎么實(shí)現(xiàn)的呢,下文就來(lái)和大家詳細(xì)講講2023-03-03使用Gorm操作Oracle數(shù)據(jù)庫(kù)踩坑記錄
gorm是目前用得最多的go語(yǔ)言orm庫(kù),本文主要介紹了使用Gorm操作Oracle數(shù)據(jù)庫(kù)踩坑記錄,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06