01-C語言和Go語言對(duì)比-指趣學(xué)院

源文件對(duì)比

  • C語言源文件
文件擴(kuò)展名 源類型
.h 頭文件,存放代碼聲明
.c C語言源文件,存放代碼實(shí)現(xiàn)
  • Go語言源文件
文件擴(kuò)展名 源類型
.go Go語言源文件,存放代碼實(shí)現(xiàn)

代碼管理對(duì)比

  • C語言中通過文件來管理代碼
    • 想使用某一個(gè)函數(shù)時(shí),只需要include導(dǎo)入對(duì)應(yīng)的.h文件即可
  • Go語言中通過包來管理代碼
    • Go語言沒有.h文件的概念, 在Go中想使用某一個(gè)函數(shù)時(shí), 只需要import導(dǎo)入對(duì)應(yīng)的包即可
  • C語言中函數(shù)、變量公私有管理
    • 通過extern和static實(shí)現(xiàn)是否公開函數(shù)和變量
  • Go語言中函數(shù)、變量公私有管理
    • 通過函數(shù)名稱首字母大小寫實(shí)現(xiàn)是否公開函數(shù)
    • 通過變量名稱首字母大小寫實(shí)現(xiàn)是否公開變量

關(guān)鍵字對(duì)比

  • C語言中一共有32個(gè)關(guān)鍵字
1 2 3 4 5 6 7 8
if else switch case default break return goto
do while for continue typedef struct enum union
char short int long float double void sizeof
signed unsigned const auto register static extern volatile
  • Go語言中一共有25個(gè)關(guān)鍵字
1 2 3 4 5 6 7 8
if else switch case default break return goto
fallthrough for continue type struct var const map
func interface range import package defer go select
chan

數(shù)據(jù)類型對(duì)比

  • C語言數(shù)據(jù)類型


  • Go語言數(shù)據(jù)類型



  • C語言各數(shù)據(jù)類型占用內(nèi)存空間
類型 32位編譯器 64位編譯器
char 1 1
int 4 4
float 4 4
double 8 8
short 2 2
long 4 8
long long 8 8
void* 4 8
  • Go語言各數(shù)據(jù)類型占用內(nèi)存空間
類型 32位編譯器 64位編譯器 本質(zhì)
int8/uint8 1 1 signed char/unsigned char
int16/uint16 2 2 signed short/unsigned short
int32/uint32 4 4 signed int/unsigned int
int64/uint64 8 8 signed long long int/unsigned long long int
byte 1 1 uint8/unsigned char
rune 4 4 int32/signed int
int 4 8 根據(jù)機(jī)器位數(shù)決定長(zhǎng)度
uintptr 4 8 根據(jù)機(jī)器位數(shù)決定長(zhǎng)度 uint32/uint64
float32 4 4 float
float64 8 8 double
true 1 1 char類型的整型
false 1 1 char類型的整型
  • 和C語言一樣,Go語言也提供了Sizeof計(jì)算變量的內(nèi)存空間
    • 1.導(dǎo)入import "unsafe"包
    • 2.通過unsafe.Sizeof()計(jì)算變量?jī)?nèi)存空間

  • Go語言基本數(shù)據(jù)類型內(nèi)部實(shí)現(xiàn)
    • golang官方網(wǎng)站下載go1.4版本源代碼
      • 越老版本的代碼越純粹,越適合新手學(xué)習(xí)
      • 隨著代碼的更新迭代會(huì)逐步變得非常復(fù)雜, 所以此處建議下載1.4版本
    • 解壓后打開路徑: go\src\runtime\runtime.h
    • 得到如下實(shí)現(xiàn)代碼
// 第8行到35行
typedef signed char     int8;
typedef unsigned char       uint8;
typedef signed short        int16;
typedef unsigned short      uint16;
typedef signed int      int32;
typedef unsigned int        uint32;
typedef signed long long int    int64;
typedef unsigned long long int  uint64;
typedef float           float32;
typedef double          float64;

#ifdef _64BIT
typedef uint64      uintptr;
typedef int64       intptr;
typedef int64       intgo; // Go's int
typedef uint64      uintgo; // Go's uint
#else
typedef uint32      uintptr;
typedef int32       intptr;
typedef int32       intgo; // Go's int
typedef uint32      uintgo; // Go's uint
#endif

#ifdef _64BITREG
typedef uint64      uintreg;
#else
typedef uint32      uintreg;
#endif

// 第153行到157行
enum
{
    true    = 1,
    false   = 0,
};

install B 時(shí)刻:
Go本質(zhì)就是用C語言編寫的一門高級(jí)編程語言
所以江哥前面教你C語言就是為了今天能讓你看懂Go的實(shí)現(xiàn)代碼,做到知其然知其所以然


常量變量對(duì)比

  • C語言定義常量和變量格式
數(shù)據(jù)類型 變量名稱 = 值;
const 數(shù)據(jù)類型 常量名稱 = 值;
  • Go語言定義常量和變量格式
    • 除了以下標(biāo)準(zhǔn)格式外,Go語言還提供了好幾種簡(jiǎn)單的語法糖
var 變量名稱 數(shù)據(jù)類型 = 值;
const 變量名稱 數(shù)據(jù)類型 = 值;

注釋對(duì)比

  • 和C語言一樣,Go語言也支持單行注釋和多行注釋, 并且所有注釋的特性都和C語言一樣
    • 單行注釋 // 被注釋內(nèi)容
    • 多行注釋 /* 被注釋內(nèi)容*/
  • 在Go語言中,官方更加推薦使用單行注釋,而非多行注釋(詳情可以直接查看Go官方源碼)

運(yùn)算符對(duì)比

  • 算數(shù)運(yùn)算符和C語言幾乎一樣
    • Go語言中++、--運(yùn)算符不支持前置
      • 錯(cuò)誤寫法: ++i; --i;
    • Go語言中++、--是語句,不是表達(dá)式,所以必須獨(dú)占一行
      • 錯(cuò)誤寫法: a = i++; return i++;
運(yùn)算符 描述 實(shí)例
+ 相加 A + B
- 相減 A - B
* 相乘 A * B
/ 相除 B / A
% 求余 B % A
++ 自增 A++
-- 自減 A--

  • 關(guān)系算符和C語言一樣
運(yùn)算符 描述 實(shí)例
== 檢查兩個(gè)值是否相等,如果相等返回 True 否則返回 False。 A == B
!= 檢查兩個(gè)值是否不相等,如果不相等返回 True 否則返回 False。 A != B
> 檢查左邊值是否大于右邊值,如果是返回 True 否則返回 False。 A > B
< 檢查左邊值是否小于右邊值,如果是返回 True 否則返回 False。 A < B
>= 檢查左邊值是否大于等于右邊值,如果是返回 True 否則返回 False。 A >= B
<= 檢查左邊值是否小于等于右邊值,如果是返回 True 否則返回 False。 A <= B

  • 邏輯運(yùn)算符和C語言一樣
運(yùn)算符 描述 實(shí)例
&& 如果兩邊的操作數(shù)都是 True,則條件 True,否則為 False。 A && B
|| 如果兩邊的操作數(shù)有一個(gè) True,則條件 True,否則為 False。 A || B
! 如果條件為 True,則邏輯 NOT 條件 False,否則為 True。 !A

  • 位運(yùn)算符和C語言幾乎一樣
    • 新增一個(gè)&^運(yùn)算符
運(yùn)算符 描述 實(shí)例
& 參與運(yùn)算的兩數(shù)各對(duì)應(yīng)的二進(jìn)位相與, 對(duì)應(yīng)位只要都是1結(jié)果就為1 A & B
| 參與運(yùn)算的兩數(shù)各對(duì)應(yīng)的二進(jìn)位相或,對(duì)應(yīng)位只要其中一個(gè)是1結(jié)果就為1 A | B
^ 參與運(yùn)算的兩數(shù)各對(duì)應(yīng)的二進(jìn)位相異或,對(duì)應(yīng)位只要不同結(jié)果就是1 A ^ B
<< 左移運(yùn)算符,左移n位就是乘以2的n次方 A << 2
>> 右移運(yùn)算符,右移n位就是除以2的n次方 B >> 2
&^ 邏輯清零運(yùn)算符, B對(duì)應(yīng)位是1,A對(duì)應(yīng)位清零,B對(duì)應(yīng)位是0, A對(duì)應(yīng)位保留原樣 A &^ B
int main(){
    /*
      0110      a
    &^1011      b 如果b位位1,那么結(jié)果為0, 否則結(jié)果為a位對(duì)應(yīng)的值
    ----------
      0100
    */
    a1 := 6
    b1 := 11
    res1 := a1 &^ b1
    fmt.Println("res1 = ", res1) // 4

    /*
      1011      a
    &^1101      b 如果b位位1,那么結(jié)果為0, 否則結(jié)果為a位對(duì)應(yīng)的值
    ----------
      0010
    */
    a2 := 11
    b2 := 13
    res2 := a2 &^ b2
    fmt.Println("res2 = ", res2) // 2
}

  • 賦值運(yùn)算符和C語言幾乎一樣
    • 新增一個(gè)&^=運(yùn)算符
運(yùn)算符 描述 實(shí)例
= 將右邊賦值給左邊 C = A + B 將 A + B 表達(dá)式結(jié)果賦值給 C
+= 相加后再賦值 C += A 等于 C = C + A
-= 相減后再賦值 C -= A 等于 C = C - A
*= 相乘后再賦值 C *= A 等于 C = C * A
/= 相除后再賦值 C /= A 等于 C = C / A
%= 求余后再賦值 C %= A 等于 C = C % A
<<= 左移賦值 C <<= 2 等于 C = C << 2
>>= 右移賦值 C >>= 2 等于 C = C >> 2
&= 位邏輯與賦值 C &= 2 等于 C = C & 2
^= 位邏輯或賦值 C ^= 2 等于 C = C ^ 2
|= 位邏輯異或賦值 C |= 2 等于 C = C | 2
&^= 位邏輯清零賦值 C &^= 2 等于 C = C &^ 2

流程控制語句對(duì)比

  • C語言流程控制中的if、switch、for在Go語言都可以使用
  • C語言中的四大跳轉(zhuǎn)語句return、break、continue、goto在Go語言都可以使用
  • Go語言除了實(shí)現(xiàn)C語言中if、switch、for、return、break、continue、goto的基本功能以外,還對(duì)if、switch、for、break、continue進(jìn)行了增強(qiáng)
    • 例如: if 條件表達(dá)式前面可以添加初始化表達(dá)式
    • 例如: break、continue可以指定標(biāo)簽
    • 例如: switch語句可以當(dāng)做if/elseif來使用
    • ... ...
  • 值得注意的是Go語言中沒有while循環(huán)和dowhile循環(huán), 因?yàn)樗鼈兡茏龅腉o語言中的for循環(huán)都可以做

函數(shù)和方法對(duì)比

  • C語言定義函數(shù)格式
返回值類型 函數(shù)名稱(形參列表) {
        函數(shù)體相關(guān)語句;
        return 返回值;
}
  • Go語言定義函數(shù)格式
func  函數(shù)名稱(形參列表)(返回值列表) {
        函數(shù)體相關(guān)語句;
        return 返回值;
}
  • C語言中沒有方法的概念, 但是Go語言中有方法
    • 對(duì)于初學(xué)者而言,可以簡(jiǎn)單的把方法理解為一種特殊的函數(shù)
func  (接收者 接受者類型)函數(shù)名稱(形參列表)(返回值列表) {
        函數(shù)體相關(guān)語句;
        return 返回值;
}

編程思想對(duì)比

  • C語言是一門面向過程的編程語言
    • 面向過程: 按部就班, 親力親為,關(guān)注的是我應(yīng)該怎么做?
    • 做飯例子: 面向過程做飯
      • 1.上街買菜
      • 2.摘菜
      • 3.洗菜
      • 4.切菜
      • 5.開火炒菜
      • 6.淘米煮飯
      • 7.吃飯
  • Go語言是門面向?qū)ο蟮木幊陶Z言
    • 面向?qū)ο?化繁為簡(jiǎn), 能不自己干自己就不干,關(guān)注的是我應(yīng)該讓誰來做?
    • 做飯例子: 面向?qū)ο笞鲲?/li>
    • 1.找個(gè)會(huì)做飯女朋友 or 男朋友
    • 2.老婆我餓了 or 老公我餓了
    • 3.躺著...等她/他把飯做好
    • 4.吃飯
  • 不要把面向過程和面向?qū)ο笙胂蟮媚敲瓷衿? 它們只是思考問題的方式不同而已

其它新增特性

  • 接口
  • 并發(fā)
  • 反射
  • 異常處理
  • ....
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,506評(píng)論 0 13
  • 1.C和C++的區(qū)別?C++的特性?面向?qū)ο缶幊痰暮锰帲?答:c++在c的基礎(chǔ)上增添類,C是一個(gè)結(jié)構(gòu)化語言,它的重...
    杰倫哎呦哎呦閱讀 9,984評(píng)論 0 45
  • 【原創(chuàng)】 歲月如梭,我在思念的長(zhǎng)河里等你。翹首期盼心中那份真實(shí)自然,殷切宛如深潭的眼眸,期守著深切與凝望.....
    戚曉梅閱讀 568評(píng)論 0 0
  • 分野阡陌稠,含光影陰厚。 云散黃昏近,鳥歸青林幽。 芳草牽衣褲,足痕身后留。 虹懸七彩線,彎鉤釣風(fēng)流。
    陽(yáng)春閱讀 158評(píng)論 3 6
  • 001探索真理 甘地把探索真理挖掘自我當(dāng)作一生追求的目標(biāo)。把真理的準(zhǔn)則當(dāng)作自己為人處事的基石。 002反省 他時(shí)刻...
    剽悍的今天閱讀 327評(píng)論 0 0

友情鏈接更多精彩內(nèi)容