源文件對(duì)比
| 文件擴(kuò)展名 |
源類型 |
| .h |
頭文件,存放代碼聲明 |
| .c |
C語言源文件,存放代碼實(shí)現(xiàn) |
| 文件擴(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ì)比
| 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 |
| 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ì)比
數(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)算符不支持前置
- Go語言中++、--是語句,不是表達(dá)式,所以必須獨(dú)占一行
- 錯(cuò)誤寫法: a = i++; return i++;
| 運(yùn)算符 |
描述 |
實(shí)例 |
| + |
相加 |
A + B |
| - |
相減 |
A - B |
| * |
相乘 |
A * B |
| / |
相除 |
B / A |
| % |
求余 |
B % A |
| ++ |
自增 |
A++ |
| -- |
自減 |
A-- |
| 運(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)算符 |
描述 |
實(shí)例 |
| && |
如果兩邊的操作數(shù)都是 True,則條件 True,否則為 False。 |
A && B |
|| |
如果兩邊的操作數(shù)有一個(gè) True,則條件 True,否則為 False。 |
A || B |
| ! |
如果條件為 True,則邏輯 NOT 條件 False,否則為 True。 |
!A |
| 運(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)算符 |
描述 |
實(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ì)比
返回值類型 函數(shù)名稱(形參列表) {
函數(shù)體相關(guān)語句;
return 返回值;
}
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ū)ο笙胂蟮媚敲瓷衿? 它們只是思考問題的方式不同而已
其它新增特性
最后編輯于 :
?著作權(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ù)。