這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。 目錄(?)[-]
- 關鍵字
- 操作符
- 變數
- 指標
- 函數
- 傳回值
- 閉包
- PO
- 編程規範
- OO
- 並發
- 專案管理
對於MarkDown 編譯器沒有自動儲存功能這件事情, 我表示嚴重的厭惡。 一個來小時的整理化為烏有,而且居然還不能匯入到HTML編輯器, 真是無法忍受!
關鍵字
| 分類 |
C |
Go |
| 字元 |
char |
無 |
| 字串 |
無 |
string |
| 浮點數 |
double , float |
float32 , float64 , complex64 , complex128 |
| 整數 |
int long short |
uint8 , uint16 , uint32 , uint64 , int8 , int16 , int32 , int64 , uint , int , uintptr , byte = uint8 , rune=unit32 |
| bool |
無 |
boolean true , false |
| 函數 |
無 |
func |
| 介面 |
無 |
interface |
| 空 |
void |
無 |
| Any |
無 |
interface{} |
| 彙總 |
enum , struct , union |
struct |
| 符號限定符號 |
signed , unsigned , auto , const , extern , register , static , volatile |
auto , const |
| 流程式控制制 |
break , case , do , for , goto , if , else , continue , default , return , switch , while |
for , if , else , goto , break , switch , case , default , fallthrough , range , select , range |
| 資料結構 |
無 |
map |
| 其他 |
sizeof , typedef |
iota , var , type , defer , go chan , package , import |
操作符
| 功能 |
C |
Go |
| 取反 |
~ |
^ |
| 選擇 |
? : |
|
| 取指標內容 |
-> |
|
| 寫入讀出 |
|
<- -> |
| 初始化並賦值 |
|
:= |
其餘的運算子基本相同
變數
| X |
C |
Go |
| 聲明/定義 |
TYPE NAME int i |
(var) NAME TYPE var i int |
| 字元(串) |
char , char [] |
byte byte[], string |
| 整形位寬 |
依賴於特定的平台和編譯器 |
可以指定寬度, 也可以依賴平台編譯器 |
| 有效範圍 |
棧上開闢的變數在範圍內有效, 堆上開闢的變數手動釋放之前有效 |
最後一個引用離開範圍之前都有效 |
| 範圍控制 |
static 限制於本檔案有效 , extern 尋找其他檔案的全域變數 |
大寫開頭可以匯出, 小寫僅限本包使用 |
指標
假設a 是一個指向某結構體的指標,這個結構體中有個成員叫b 。
- 取指標
& 運算子 和解指標 * 運算子是一樣的.
- 在指標比較中, Go 中的 nil 等效C語言的 NULL .
函數
傳回值
比如:
func exchange( a int , b int ) ( int , int ){ return b , a}
閉包
C 語言的函數和變數是兩個不同的概念, 變數僅可以通過函數指標的形式來標識一個函數.
Go 語言的函數也是一種變數 .
嘗試下一下代碼:
package mainimport "fmt"func GetFunc( ) func(int) int { i := 0 // 這個變數被綁定到下面的返回函數 return increment_i ( j int ) int { i += j; return i } }func main() { func_i1 := GetFunc() func_i2 := GetFunc() // 上面兩次調用GetFunc, 獲得兩個increment_i 函數, 各自綁定自己的 i 變數 for i :=0 ; i < 10; i++ { fmt.Println("Func1 print : ", func_i1(i)) fmt.Println("Func2 print : ", func_i2(i+1)) }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
PO
| X |
C |
Go |
| if |
“if ( condition) XXX else XXX“` |
“`if condition {XXX} else {XXX} |
| switch |
只能選擇可以轉化為整形的 , case中沒有break自動繼續 |
可以任意類型, 不會自動繼續, 除非使用failthrough |
| select |
是個函數 |
關鍵字, 選擇chan |
| for |
for ( ; ; ) XXX |
for ; ; {XXX} |
| while |
有 |
無 |
| do … while |
有 |
無 |
編程規範
- 句末不需要分號
- if for 的程式碼片段必須被大括弧包圍
- if 的 condition 不要括弧
- for 的 指示部分不要括弧
- 左花括弧不能自成一行
OO
- Method
在關鍵字 func 和函數名字之間說明屬於那個結構體。
type OOTest struct { a int}func ( this * OOTest) GetAByPointer() int { return this.a}func ( this OOTest) GetAByCopy() int { return this.a}
type IOOTest interface { GetAByPointer() int }
使用的時候將實現了對應的介面的結構體對象指標賦值給介面對象
var i_test IOOTestvar test OOTest i_test = &test
type OOTest1 struct{ OOTest b int}
這樣 OOTest1 就擁有了 OOTest 的成員變數和方法
並發
| X |
C/C++ |
Go |
| 實現 |
依賴系統介面的線程 |
go 關鍵字, goroutine協程 |
| 鎖 |
依賴系統提供或者庫或者自己實現 |
sync包 |
| 通訊 |
共用記憶體/訊息 |
訊息 chan機制 |
專案管理
| X |
C/C++ |
Go |
| 編譯器 |
自行挑選 |
內建 |
| 工程管理 |
自行挑選 |
內建 |
| 測試機制 |
自行挑選 |
內建 |
| 統一編碼格式 |
依賴程式員自覺 |
工具統一整理 |
原文地址
http://studygolang.com/wr?u=http%3a%2f%2fblog.csdn.net%2fcchd0001%2farticle%2fdetails%2f44982127