【GO for java programmers】面向Java開發人員的GO編程2

來源:互聯網
上載者:User
文章目錄
  • 條件陳述式
  • For 語句
  • Break和continue
  • Switch 語句
  • ++ 和 -- 語句
  • defer語句

英文原文在此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++) {}  // 無效的

此外, ifswitch 接收一個可選的初始化的狀態,那麼慣用做法是建一個局部變數

if err := file.Chmod(0664); err != nil {    log.Print(err)    return err}
For 語句

Go沒有whiledo-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使用指標。對於任何類型e T,有一個相應的指標類型*T,表示指標類型 T的值

給指標變數分配儲存空間,使用內建函數new,傳入一個類型,並返回一個指標,指向分配的儲存空間。分配的空間將被零初始化的類型。例如,new(int) 分配儲存為一個新的int,初始化它的值為e 0,並返回它的地址,類型
*int

Java代碼T p = new T(),其中 T是一個兩個int型執行個體變數ab的類,對應於

type T struct { a, b int }var p *T = new(T)

或者習慣性這樣幹

p := new(T)

var v T代表聲明,聲明了一個變數包含一個實值型別 T,這在Java中是沒有的。也可使用複合方式建立並初始化值。

v := T{1, 2}

等同於

var v Tv.a = 1v.b = 2

對於類型T的運算元x地址運算子 &x提供實值型別為*Tx的地址,

===================未完待續.......==========

===================轉載註明出處=============

2012-12-17

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.