這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
英文原文在此www.nada.kth.se/~snilsson/go_for_java_programmers
譯文同步至http://blog.csdn.net/kkkloveyou/article/details/8308534
http://bbs.gocn.im/thread-73-1-1.html
====================接上文,以下本文========================.
條件陳述式
Go在條件陳述式中並不使用括弧,像 if
條件陳述式 , for
條件陳述式的運算式, switch
條件陳述式的值. 另一方面,它並不需要在if
或for
條件陳述式中加花括弧
if a < b { f() }if (a < b) { f() } // 括弧是不必要的.if (a < b) f() // 無效的for i = 0; i < 10; i++ {}for (i = 0; i < 10; i++) {} // 無效的
此外, if
和switch
接收一個可選的初始化的狀態,那麼慣用做法是建一個局部變數
if err := file.Chmod(0664); err != nil { log.Print(err) return err}
For 語句
Go沒有while
和do-while
語句. 當for
語句的條件比較單一時,他的作用就像是while
語句. 完全省略條件則產生一個死迴圈。
for
語句可能包含range
遍曆 strings, arrays, slices, maps, 或 channels。除了寫成下面這樣
for i := 0; i < len(a); i++ { ... }
去遍曆a
的元素,也可以寫成
for i, v := range a { ... }
這裡的i
指索引, v
代表的array, slice, 或者string的連續元素。對於字串,i是一個位元組的索引,v
指向rune
類型(rune
類型是int32
)的一個別名)。maps迭代產生鍵 - 值對,而channels只產生一個迭代值。
Break和continue
像Java一樣,GO許可break和continue指定一個標籤,但標籤上必須指的for
, switch
, 或者select
語句.
Switch 語句
在 switch
語句,case
標籤預設情況下不通過,但你可以讓他們 fallthrough
語句結束的情況下通過了。
switch n {case 0: // empty case bodycase 1: f() // f is not called when n == 0.}
但是一個case
可以包含過個值
switch n {case 0, 1: f() // f is called if n == 0 || n == 1.}
case
的值可以支援任何類型的相等比較操作符,如字串或指標。一個丟失運算式的switch語句 等價於運算式為 true
。
switch {case n < 0: f1()case n == 0: f2()default: f3()}
++ 和 -- 語句
++
和--
只能作為尾碼操作符,和僅在語句中,而不是在運算式中。例如,你不可以寫n = i++
。
defer語句
defer
語句調用一個函數的執行被延遲到函數返回那一刻。defer
語句執行時,被遞延的函數的參數被計算,並儲存,以備將來使用
f, err := os.Open("filename")defer f.Close() // f will be closed when this function returns.
Constants(常量)
GO中的常數可能是untyped的。這適用於無類型的常量運算式的數字文本,和使用const
聲明的無類型的常量運算式。當它被用在需要一個帶類型的值的背景下,一個無類型的常量的可以被轉變成有類型的值。這樣常量的使用相對自由,即使Go沒有隱式類型轉換
var a uintf(a + 1) // The untyped numeric constant 1 becomes typed as uint.f(a + 1e3) // 1e3 is also typed as uint.
語言對非類型化的數字常量不限制大小。限制僅適用於使用一個常量時,其中一種類型是必需的。
const huge = 1 << 100var n int = huge >> 98
如果是不存在的變數聲明的類型和相應的運算式的計算結果為一個非類型化的數字常數,這個常數是被轉換為 rune
, int
,float64
, 或者complex128
類型,取決於該值是否一個字元,整數,浮點,或複雜的常數。
c := 'ä' // rune (alias for int32)n := 1 + 2 // intx := 2.7 // float64z := 1 + 2i // complex128
GO 不存在枚舉類型。相反,你可以使用特殊的名字iota
在單一的const
聲明中從而得到一系列累加值。當初始設定式省略為一個const
,它重用了前面的運算式。
const ( red = iota // red == 0 blue // blue == 1 green // green == 2)
Structs(結構體)
結構體對應於Java中的類,但一個結構的成員不能是方法,而是變數。結構體的指標是類似Java的的引用變數。與Java類不同的是,結構也可以被定義為直接值。在這兩種情況下使用.
來訪問結構體的成員。
type MyStruct struct { s string n int64}var x MyStruct // x is initialized to MyStruct{"", 0}.var px *MyStruct // px is initialized to nil.px = new(MyStruct) // px points to the new struct MyStruct{"", 0}.x.s = "Foo"px.s = "Bar"
在Go中,方法可以與任何命名的類型關聯,而不僅僅是與結構體。詳情見方法和介面的討論。
Pointers(指標)
如果你有一個int或struct或者array需要指派至的內容複寫。 想達到Java的引用變數的效果,Go使用指標。對於任何類型eT
,有一個相應的指標類型*T
,表示指標類型T
的值
給指標變數分配儲存空間,使用內建函數new
,傳入一個類型,並返回一個指標,指向分配的儲存空間。分配的空間將被零初始化的類型。例如,new(int)
分配儲存為一個新的int,初始化它的值為e0
,並返回它的地址,類型*int
。
Java代碼Tp=newT()
,其中 T
是一個兩個int
型執行個體變數a
和b
的類,對應於
type T struct { a, b int }var p *T = new(T)
或者習慣性這樣幹
p := new(T)
varvT
代表聲明,聲明了一個變數包含一個實值型別T
,這在Java中是沒有的。也可使用複合方式建立並初始化值。
v := T{1, 2}
等同於
var v Tv.a = 1v.b = 2
對於類型T
的運算元x
,地址運算子 &x
提供實值型別為*T
的x
的地址,
===================未完待續.......==========
===================轉載註明出處=============
2012-12-17