<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # [X分鐘速成Y](http://learnxinyminutes.com/) ## 其中 Y=Go 源代碼下載:?[learngo-cn.go](http://learnxinyminutes.com/docs/files/learngo-cn.go) 發明Go語言是出于更好地完成工作的需要。Go不是計算機科學的最新發展潮流,但它卻提供了解決現實問題的最新最快的方法。 Go擁有命令式語言的靜態類型,編譯很快,執行也很快,同時加入了對于目前多核CPU的并發計算支持,也有相應的特性來實現大規模編程。 Go語言有非常棒的標準庫,還有一個充滿熱情的社區。 ~~~ // 單行注釋 /* 多行 注釋 */ // 導入包的子句在每個源文件的開頭。 // Main比較特殊,它用來聲明可執行文件,而不是一個庫。 package main // Import語句聲明了當前文件引用的包。 import ( "fmt" // Go語言標準庫中的包 "net/http" // 一個web服務器包 "strconv" // 字符串轉換 ) // 函數聲明:Main是程序執行的入口。 // 不管你喜歡還是不喜歡,反正Go就用了花括號來包住函數體。 func main() { // 往標準輸出打印一行。 // 用包名fmt限制打印函數。 fmt.Println("Hello world!") // 調用當前包的另一個函數。 beyondHello() } // 函數可以在括號里加參數。 // 如果沒有參數的話,也需要一個空括號。 func beyondHello() { var x int // 變量聲明,變量必須在使用之前聲明。 x = 3 // 變量賦值。 // 可以用:=來偷懶,它自動把變量類型、聲明和賦值都搞定了。 y := 4 sum, prod := learnMultiple(x, y) // 返回多個變量的函數 fmt.Println("sum:", sum, "prod:", prod) // 簡單輸出 learnTypes() // 少于y分鐘,學的更多! } // 多變量和多返回值的函數 func learnMultiple(x, y int) (sum, prod int) { return x + y, x * y // 返回兩個值 } // 內置變量類型和關鍵詞 func learnTypes() { // 短聲明給你所想。 s := "Learn Go!" // String類型 s2 := `A "raw" string literal can include line breaks.` // 同樣是String類型 // 非ascii字符。Go使用UTF-8編碼。 g := 'Σ' // rune類型,int32的別名,使用UTF-8編碼 f := 3.14195 // float64類型,IEEE-754 64位浮點數 c := 3 + 4i // complex128類型,內部使用兩個float64表示 // Var變量可以直接初始化。 var u uint = 7 // unsigned 無符號變量,但是實現依賴int型變量的長度 var pi float32 = 22. / 7 // 字符轉換 n := byte('\n') // byte是uint8的別名 // 數組類型編譯的時候大小固定。 var a4 [4] int // 有4個int變量的數組,初始為0 a3 := [...]int{3, 1, 5} // 有3個int變量的數組,同時進行了初始化 // Slice 可以動態的增刪。Array和Slice各有千秋,但是使用slice的地方更多些。 s3 := []int{4, 5, 9} // 和a3相比,這里沒有省略號 s4 := make([]int, 4) // 分配一個有4個int型變量的slice,全部被初始化為0 var d2 [][]float64 // 聲明而已,什么都沒有分配 bs := []byte("a slice") // 類型轉換的語法 p, q := learnMemory() // 聲明p,q為int型變量的指針 fmt.Println(*p, *q) // * 取值 // Map是動態可增長關聯數組,和其他語言中的hash或者字典相似。 m := map[string]int{"three": 3, "four": 4} m["one"] = 1 // 在Go語言中未使用的變量在編譯的時候會報錯,而不是warning。 // 下劃線 _ 可以使你“使用”一個變量,但是丟棄它的值。 _,_,_,_,_,_,_,_,_ = s2, g, f, u, pi, n, a3, s4, bs // 輸出變量 fmt.Println(s, c, a4, s3, d2, m) learnFlowControl() // 回到流程控制 } // Go全面支持垃圾回收。Go有指針,但是不支持指針運算。 // 你會因為空指針而犯錯,但是不會因為增加指針而犯錯。 func learnMemory() (p, q *int) { // 返回int型變量指針p和q p = new(int) // 內置函數new分配內存 // 自動將分配的int賦值0,p不再是空的了。 s := make([]int, 20) // 給20個int變量分配一塊內存 s[3] = 7 // 賦值 r := -2 // 聲明另一個局部變量 return &s[3], &r // & 取地址 } func expensiveComputation() int { return 1e6 } func learnFlowControl() { // If需要花括號,括號就免了 if true { fmt.Println("told ya") } // 用go fmt 命令可以幫你格式化代碼,所以不用怕被人吐槽代碼風格了, // 也不用容忍被人的代碼風格。 if false { // pout } else { // gloat } // 如果太多嵌套的if語句,推薦使用switch x := 1 switch x { case 0: case 1: // 隱式調用break語句,匹配上一個即停止 case 2: // 不會運行 } // 和if一樣,for也不用括號 for x := 0; x < 3; x++ { // ++ 自增 fmt.Println("iteration", x) } // x在這里還是1。為什么? // for 是go里唯一的循環關鍵字,不過它有很多變種 for { // 死循環 break // 騙你的 continue // 不會運行的 } // 和for一樣,if中的:=先給y賦值,然后再和x作比較。 if y := expensiveComputation(); y > x { x = y } // 閉包函數 xBig := func() bool { return x > 100 // x是上面聲明的變量引用 } fmt.Println("xBig:", xBig()) // true (上面把y賦給x了) x /= 1e5 // x變成10 fmt.Println("xBig:", xBig()) // 現在是false // 當你需要goto的時候,你會愛死它的! goto love love: learnInterfaces() // 好東西來了! } // 定義Stringer為一個接口類型,有一個方法String type Stringer interface { String() string } // 定義pair為一個結構體,有x和y兩個int型變量。 type pair struct { x, y int } // 定義pair類型的方法,實現Stringer接口。 func (p pair) String() string { // p被叫做“接收器” // Sprintf是fmt包中的另一個公有函數。 // 用 . 調用p中的元素。 return fmt.Sprintf("(%d, %d)", p.x, p.y) } func learnInterfaces() { // 花括號用來定義結構體變量,:=在這里將一個結構體變量賦值給p。 p := pair{3, 4} fmt.Println(p.String()) // 調用pair類型p的String方法 var i Stringer // 聲明i為Stringer接口類型 i = p // 有效!因為p實現了Stringer接口(類似java中的塑型) // 調用i的String方法,輸出和上面一樣 fmt.Println(i.String()) // fmt包中的Println函數向對象要它們的string輸出,實現了String方法就可以這樣使用了。 // (類似java中的序列化) fmt.Println(p) // 輸出和上面一樣,自動調用String函數。 fmt.Println(i) // 輸出和上面一樣。 learnErrorHandling() } func learnErrorHandling() { // ", ok"用來判斷有沒有正常工作 m := map[int]string{3: "three", 4: "four"} if x, ok := m[1]; !ok { // ok 為false,因為m中沒有1 fmt.Println("no one there") } else { fmt.Print(x) // 如果x在map中的話,x就是那個值嘍。 } // 錯誤可不只是ok,它還可以給出關于問題的更多細節。 if _, err := strconv.Atoi("non-int"); err != nil { // _ discards value // 輸出"strconv.ParseInt: parsing "non-int": invalid syntax" fmt.Println(err) } // 待會再說接口吧。同時, learnConcurrency() } // c是channel類型,一個并發安全的通信對象。 func inc(i int, c chan int) { c <- i + 1 // <-把右邊的發送到左邊的channel。 } // 我們將用inc函數來并發地增加一些數字。 func learnConcurrency() { // 用make來聲明一個slice,make會分配和初始化slice,map和channel。 c := make(chan int) // 用go關鍵字開始三個并發的goroutine,如果機器支持的話,還可能是并行執行。 // 三個都被發送到同一個channel。 go inc(0, c) // go is a statement that starts a new goroutine. go inc(10, c) go inc(-805, c) // 從channel中獨處結果并打印。 // 打印出什么東西是不可預知的。 fmt.Println(<-c, <-c, <-c) // channel在右邊的時候,<-是讀操作。 cs := make(chan string) // 操作string的channel cc := make(chan chan string) // 操作channel的channel go func() { c <- 84 }() // 開始一個goroutine來發送一個新的數字 go func() { cs <- "wordy" }() // 發送給cs // Select類似于switch,但是每個case包括一個channel操作。 // 它隨機選擇一個準備好通訊的case。 select { case i := <-c: // 從channel接收的值可以賦給其他變量 fmt.Println("it's a", i) case <-cs: // 或者直接丟棄 fmt.Println("it's a string") case <-cc: // 空的,還沒作好通訊的準備 fmt.Println("didn't happen.") } // 上面c或者cs的值被取到,其中一個goroutine結束,另外一個一直阻塞。 learnWebProgramming() // Go很適合web編程,我知道你也想學! } // http包中的一個簡單的函數就可以開啟web服務器。 func learnWebProgramming() { // ListenAndServe第一個參數指定了監聽端口,第二個參數是一個接口,特定是http.Handler。 err := http.ListenAndServe(":8080", pair{}) fmt.Println(err) // 不要無視錯誤。 } // 使pair實現http.Handler接口的ServeHTTP方法。 func (p pair) ServeHTTP(w http.ResponseWriter, r *http.Request) { // 使用http.ResponseWriter返回數據 w.Write([]byte("You learned Go in Y minutes!")) } ~~~ ## 更進一步 Go的根源在[Go官方網站](http://golang.org/)。 在那里你可以學習入門教程,通過瀏覽器交互式地學習,而且可以讀到很多東西。 強烈推薦閱讀語言定義部分,很簡單而且很簡潔!(as language definitions go these days.) 學習Go還要閱讀Go[標準庫的源代碼](http://golang.org/src/),全部文檔化了,可讀性非常好,可以學到go,go style和go idioms。在[文檔](http://golang.org/pkg/)中點擊函數名,源代碼就出來了!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看