首發於
[list]
[*]概念不同點
[*]語法
[*]常量
[*]片(slices)
[*]建值(****** values)
[*]介面
[*]併發
[*]通道
[/list]
go是乙個以通用系統語言為設計目標的系統級語言, 如 c++. 以下是針對c++程式設計師的一些學習拉摘要. 這文章主要討論go和c++的不同。
概念不同
* go沒有帶構建器和析構器的類. 取而代之的是繼承階級和虛函式, go提供介面,下文會詳細說明. c++用模板實現
* go使用記憶體**機制.沒有必要也不可能明確地**記憶體. 現代處理器中記憶體**是為了更高效地程式設計
* go有指標但沒有指標運算. 你不能用指標變數來遍歷乙個字元的各個位
* go中陣列是優先值. 當陣列作為引數使用,函式獲得陣列的乙個拷貝, 而不是指標. 然而在實際應用中一般用片作為引數;片有指向陣列的指標;片在下面會詳細討論。
* 字串由語言提供,一旦建立就不能再改變.
* go提供雜湊表,稱之類對映(map)
* 分離的執行緒執行, 通過通道通訊,也是語言本身整合的.後面會詳細討論.
* 特定型別 (對映和通道後面會詳細說明) 以引用方式傳遞, 而非值傳遞. 傳遞乙個對映給函式不會獲得函式的乙個拷貝, 所以如果函式改變了其值,呼叫者能看得到. 在c++中可以理解成引用.
*go沒有標頭檔案.取而代之地把所有檔案當成包的一部分. 當包定義了乙個以大寫開頭的物件 (型別、常量、變數、函式),這個物件在所有引用該包的檔案中可見
* go 不支援隱含型別轉換. 不同型別資料進行運算時需要轉換
* go 不支援函式過載和使用者自定義操作符.
* go does 常量或可變限定詞
* go 使用nil而不是c++中的null或0作為邏輯非。
句法宣告句法和c++相比相反. 型別寫在變數前. 這樣宣告更容易看清楚
go c++
var v1 int; // int v1;
var v3 [10]int; // int v3[10];
var v5 struct ; // struct v5;
var v6 *int; // int* v6; (but no pointer arithmetic)
var v8 func(a int) int; // int (*v8)(int a);
i int;
m float
)[/code]當宣告乙個函式, 要麼為每個引數提供乙個名稱,要麼提供乙個名稱給任意引數;但不能忽略一部分而只提供一半分引數,你可以把相關型別的引數組織到一起:[code]func f(i, j, k int, s, t string);[/code]宣告時允許初始化. 如果這樣做,那麼指定型別是允許的,但不是必要的. 如果宣告時變數型別沒有被指定,那麼其型別由初始化的值決定.
var v = *p;
請再參見關於常量的討論. 如果乙個變數沒有被明確地初始化, 那麼必須宣告其型別. 在這種情況下會被隱式初始化為零值(0, nil, 或其它.). 所以go中沒有未被初始化的變數.
函式中,短宣告語法可用:= .
v1 := v2;
這等價於
var v1 = v2;
go 多值平行賦值.
i, j = j, i; // 交換i j的值.
函式能返回多值, 由括號內的列表表示. 返回值可同時賦值給多個值.
unc f() (i int, j int);
v1, v2 = f();
go 把分號作為分隔符, 而不是終止標誌. 而且, 分號可以被省略如果後面緊跟乙個宣告塊的閉括號或者不是表示式一部分的花括號(如, var s struct {} or ). 分號在高層的檔案中不需要使用(全域性宣告中). 然而,在語句中他們始終被允許的,所以你依然可以按照c++的規範來寫.
當使用指標指向結構體要用 . 而不是 ->. 所以語法上來說乙個結構體跟乙個指標指向結構體是相同的處理方式.[code]
type mystruct struct
var v9 mystruct; // v9 has structure type
var p9 *mystruct; // p9 is a pointer to a structure
f(v9.i, p9.i)
[/code]go在if語句中不要求括號把條件括起來, for語句的條件式也不要,或者switch語句. 但後面的語句需要用花括號.[code]
if a < b // valid
if (a < b) // valid (condition is a parenthesized expression)
if (a < b) f(); // invalid
for i = 0; i < 10; i++ {} // valid
for (i = 0; i < 10; i++) {} // invalid
[/code]go 沒有while和do..while語句. for語句可以使用單條件來實現while語句的功能. 忽略終止條件就能實現無休止迴圈。
go 允許break和continue指定特定的層次. 但指定的必需是for,if,switch.
在乙個switch語句中,case標籤不能跳過. 你可以使用fallthrough來跳過. 這適用於相臨的語句。[code]
switch i
[/code]但乙個case可以有多個值.[code]
switch i
[/code]case中的值不需要是常量,或者是偶數; 任何能進行等值比較的型別,如字串和指標都可以,如果case的值被省略,則預設為真。[code]
switch
[/code]++ --操作符只能用在語句中,不能用在表示式中. 不能寫 c = *p++. 而*p++ 會被解釋為 (*p)++.
defer語句用來呼叫乙個函式,當乙個函式包含了defer語句的返回值.[code]
fd := open("filename");
defer close(fd); // fd will be closed when this function returns.
[/code]常量 [top]
go中的常量可以不指定型別. 這同樣可以應用到用 const 宣告的常量上, 如果宣告時沒有指定型別,並且在初始化時使用不指定型別的賦值. 乙個常量會被自動新增上型別當它進行某種要求特定型別運算時. 這允許常量相對自由地使用而無需明確地進行型別轉換.[code]
var a uint;
f(a + 1) // untyped numeric constant "1" becomes typed as uint
[/code]語言不限制未指定型別的數字常量或常量表示式的大小. 只有當常量被應用在某種要求特定型別的資料操作時,常量的大小才會被限定.[code]
const huge = 1 << 100;
f(huge >> 98)
[/code]go 不支援列舉. 但是相應地,你可以使用在乙個單常量宣告中使用iota來獲得一系列遞增的值. 當乙個常量的初始化表達化被省略了,它會重用前面的表示式.[code]
const (
red = iota; // red == 0
blue; // blue == 1
green // green == 2
)[/code]片[top]
片在概念上是具有三個域的結構: 指向陣列的指標, 長度, 容量. 片支援使用 操作符來獲得指向陣列的元素. 內建len 函式返回片的長度. 內建cap函式返回容量.
給定乙個陣列,或者另乙個片,乙個片通過a[i:j]來建立. 這樣建立了乙個指向a的片引用,開始於索引i,終止於索引j之前. 長度為j-i.新片指向與a相同的陣列.也就是說,改變新片的內容在a陣列也可見 . 新片的容量等於a的容量減去i. 陣列的容量是陣列的長度. 你也可以賦乙個陣列指標給乙個片; 給定 var s int; var a[10] int, 賦值 s = &a 等同於 s = a[0:len(a)].
。。。。翻譯中,未完待續。。。。
程式設計師的速成方法!!
結合搜尋到的東西,開始著手做一些計畫,先看啥,後看啥,或者為了看啥,先準備點啥,等等,我覺得先寫寫計畫還是挺有用的,這個依各人愛好與習慣,反正我比較喜歡列計畫表,有長期如未來3年,5年,20年,或者短的3個月,1周等等,這個按你自己的進度安排 平時有空的時候上上部落格,瀏覽最新的技術動態,長長見識,...
C語言程式設計師的自述
作為乙個c語言程式設計師,我很自豪,可以做任何事情。作為乙個c語言學習者,會問很多問題,為什麼c語言做不到這個,做不到那個?不要問為什麼不能彈出乙個messagebox,不,那不是c語言的內容,也不要問為什麼不能在螢幕上繪出乙個線條或者別的什麼圖案,c語言可以在任何地方繪製,只要那裡有個螢幕,有相關...
《黑馬程式設計師》 C語言的認識
c語言是一種通用的結構化語言。它的通用性和無限制性,使得它對許多程式設計者來說都顯得更加通俗和有效。無論是系統軟體或者資料的處理 非數值計算等,都可以很方便的使用c語言。c語言的主要特點 1 簡潔 緊湊 靈活。2 模組化 結構化。3 移植性強。4 生成目標 質量高,程式執行效率高。c程式的組成 乙個...