青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

30分鐘上手GO語言--基礎語法

轉載自:http://studygolang.com/topics/548

本章主要分成三個部分:第一部分包括基本語法和數據結構;第二部分討論方法和接口;第三部分介紹并發機制。 包、變量和函數 先看一個例子Packages.go:

package main  import (     "fmt"     "math/rand" )  func add(x int, y int) int {     return x + y }  func main() {     fmt.Println("My favorite number is", rand.Intn(10))     fmt.Println(add(42, 13)) } 

包:每個 Go 程序都是由包(package)組成的,程序運行的入口是包 main。

導入:這個代碼用圓括號組合了導入,這是“打包”導入語句。同樣可以編寫多個導入語句,例如:

import "fmt" import "math" 

這個程序使用并導入了包 "fmt" 和 "math/rand"。包名與導入路徑的最后一個目錄一致。例如,如果你導入了"math/rand",那么你就可以在程序里面直接寫rand.Intn(10),但如果你導入的是"math",那么你就得寫math.rand.Intn(10)。

函數:函數可以沒有參數或接受多個參數。在這個例子中,add 接受兩個 int 類型的參數,注意類型在變量名之后。有沒有覺得很奇怪呢,下面就詳細解釋一下go這樣做的原因。 看一個c的例子:

int (*fp)(int (*ff)(int x, int y), int b) 

我相信學過c的同學為了看懂這個都下了不少功夫吧,有沒有感覺到痛苦或者說痛苦之后的那一點點優越感。 什么?你還能看懂?那么再來一個:

int (*(*fp)(int (*)(int, int), int))(int, int);// 10s內看懂的同學給我回復下這個定義是啥,我請你吃飯。 

用go語言的話這兩個例子的定義如下:

f func(func(int,int) int, int) int f func(func(int,int) int, int) func(int, int) int 

是不是清晰多了,原來f返回的是一個函數啊。。。

函數參數: 當兩個或多個連續的函數命名參數是同一類型,則除了最后一個類型之外,其他都可以省略,比如func add(x int, y int) int可以寫為func add(x, y int) int 函數返回值:

函數可以返回任意數量的返回值,比如func swap(x, y string) (string, string)。 并且,函數的返回值還可以被命名,并且像變量那樣使用,比如

func split(sum int) (x, y int) {     x = sum * 4 / 9     y = sum - x     return } 

沒有參數的 return 語句返回結果的當前值。 變量: var 語句定義了一個變量的列表;跟函數的參數列表一樣,類型在后面,可以定義在包或函數級別。比如:

package main import "fmt" var c, python, java bool func main() {     var i int     fmt.Println(i, c, python, java) } 

變量的初始化: 變量定義可以包含初始值,每個變量對應一個。如果初始化是使用表達式,則可以省略類型;變量從初始值中獲得類型。比如:var i, j int = 1, 2或者var c, python, java = true, false, "no!" 短聲明變量:在函數中,:= 簡潔賦值語句在明確類型的地方,可以用于替代 var 定義。 函數外的每個語句都必須以關鍵字開始(var、func、等等),:= 結構不能使用在函數外。比如:

package main import "fmt" func main() {     var i, j int = 1, 2     k := 3     c, python, java := true, false, "no!"     fmt.Println(i, j, k, c, python, java) } 

Go的基本類型:這里先簡單列一下,后面再具體講

bool string int  int8  int16  int32  int64 uint uint8 uint16 uint32 uint64 uintptr byte // uint8 的別名 rune // int32 的別名// 代表一個Unicode碼 float32 float64 complex64 complex128 

零值:變量在定義時沒有明確的初始化時會賦值為零值。數值類型為 0,布爾類型為 false,字符串為 ""。 類型轉換:Go 的在不同類型之間的項目賦值時需要顯式轉換。表達式 T(v) 將值 v 轉換為類型 T。比如:

var i int = 42 var f float64 = float64(i) var u uint = uint(f) 

或者,更加簡單的形式:

i := 42 f := float64(i) u := uint(f) 

類型推導:在定義一個變量但不指定其類型時(使用沒有類型的 var 或 := 語句), 變量的類型由右值推導得出。 var i int j := i // j 也是一個 int 但是當右邊包含了未指名類型的數字常量時,新的變量就可能是 int 、 float64 或complex128。 這取決于常量的精度:

i := 42           // int f := 3.142        // float64 g := 0.867 + 0.5i // complex128 

常量:常量的定義與變量類似,只不過使用 const 關鍵字,常量可以是字符、字符串、布爾或數字類型的值,常量不能使用 := 語法定義。 流程控制語句 for循環:Go 只有一種循環結構for循環?;镜?for 循環除了沒有了 ( ) 之外(,看起來跟 C 或者 Java 中做的一樣,而 { } 是必須的。比如:

package main import "fmt" func main() {     sum := 0     for i := 0; i < 10; i++ {         sum += i     }     fmt.Println(sum) } 

死循環:如果省略了循環條件,循環就不會結束,因此可以用更簡潔地形式表達死循環。

package main func main() {     for {     } } 

If語句:if 語句除了沒有了 ( ) 之外,看起來跟 C 或者 Java 中的一樣,而 { } 是必須的。

func sqrt(x float64) string {     if x < 0 {         return sqrt(-x) + "i"     }     return fmt.Sprint(math.Sqrt(x)) } 

可以在if條件之前執行一個簡單的語句,由這個語句定義的變量的作用域僅在 if 范圍之內,比如:

func pow(x, n, lim float64) float64 {     if v := math.Pow(x, n); v < lim {         return v     }     return lim } 

在 if 的便捷語句定義的變量同樣可以在任何對應的 else 塊中使用,比如:

func pow(x, n, lim float64) float64 {     if v := math.Pow(x, n); v < lim {         return v     } else {         fmt.Printf("%g >= %g\n", v, lim)     }     // 這里開始就不能使用 v 了     return lim } 

Switch語句:switch 的條件從上到下的執行,當匹配成功的時候停止,除非以 fallthrough 語句結束,否則分支會自動終止。比如:

switch i { case 0: case f(): } 

當 i==0 時不會調用 f。沒有條件的 switch 同 switch true 一樣,這一構造使得可以用更清晰的形式來編寫長的 if-then-else 鏈。

func main() {     t := time.Now()     switch {     case t.Hour() < 12:         fmt.Println("Good morning!")     case t.Hour() < 17:         fmt.Println("Good afternoon.")     default:         fmt.Println("Good evening.")     } } 

Defer語句:defer 語句會延遲函數的執行直到上層函數返回,延遲調用的參數會立刻生成,但是在上層函數返回前函數都不會被調用。比如打印hello world:

func main() {     defer fmt.Println("world")     fmt.Println("hello") } 

延遲的函數調用被壓入一個棧中。當函數返回時, 會按照后進先出的順序調用被延遲的函數調用。

func main() {     fmt.Println("counting")     for i := 0; i < 10; i++ {         defer fmt.Println(i)     }     fmt.Println("done") } 

輸出

counting done 9 8 7 6 5 4 3 2 1 0 

這個功能用來做清理工作非常清晰且強大,可以用結構化編程的思路處理面向對象編程中類似析構函數的功能。舉一個實際點的例子:

func CopyFile(dstName, srcName string) (written int64, err error) {     src, err := os.Open(srcName)     if err != nil {         return     }     defer src.Close()      dst, err := os.Create(dstName)     if err != nil {         return     }     defer dst.Close()      return io.Copy(dst, src) } 

復雜類型 指針:Go 具有指針。 指針保存了變量的內存地址,類型 T 是指向類型 T 的值的指針。其零值是 nil,& 符號會生成一個指向其作用對象的指針, 符號表示指針指向的底層的值。

var p *int i := 42 p = &i fmt.Println(*p) // 通過指針 p 讀取 i *p = 21         // 通過指針 p 設置 i 

與 C 不同,Go 沒有指針運算。 結構體:一個結構體(struct)就是一個字段的集合,跟C類似,結構體字段使用點號來訪問,結構體字段可以通過結構體指針來訪問。

type Vertex struct {     X int     Y int }  func main() {     fmt.Println(Vertex{1, 2})     v.X = 4     fmt.Println(v.X)     p := &v     p.X = 1e9 } 

結構體文法:結構體文法表示通過結構體字段的值作為列表來新分配一個結構體。使用 Name: 語法可以僅列出部分字段。(字段名的順序無關。)特殊的前綴 & 返回一個指向結構體的指針。

type Vertex struct {     X, Y int }  var (     v1 = Vertex{1, 2}  // 類型為 Vertex     v2 = Vertex{X: 1}  // Y:0 被省略     v3 = Vertex{}      // X:0 和 Y:0     p  = &Vertex{1, 2} // 類型為 *Vertex ) 

數組:類型 [n]T 是一個有 n 個類型為 T 的值的數組,數組的長度是其類型的一部分,因此數組不能改變大小。 Slice:一個 slice 會指向一個序列的值,并且包含了長度信息,[]T 是一個元素類型為 T 的 slice。slice 可以重新切片,創建一個新的 slice 值指向相同的數組。s[lo:hi] 表示從 lo 到 hi-1 的 slice 元素,含兩端,因此s[lo:lo] 是空的。下標從0開始。

package main import "fmt"  func main() {     p := []int{2, 3, 5, 7, 11, 13}     fmt.Println("p ==", p)     fmt.Println("p[1:4] ==", p[1:4])      // 省略下標代表從 0 開始     fmt.Println("p[:3] ==", p[:3])      // 省略上標代表到 len(s) 結束     fmt.Println("p[4:] ==", p[4:]) } 

構造slice:slice 由函數 make 創建。這會分配一個零長度的數組并且返回一個 slice 指向這個數組,比如:

a := make([]int, 5)  // len(a)=5 

為了指定容量,可傳遞第三個參數到 make

b := make([]int, 0, 5) // len(b)=0, cap(b)=5 b = b[:cap(b)] // len(b)=5, cap(b)=5 b = b[1:]      // len(b)=4, cap(b)=4 

slice 的零值是 nil,一個 nil 的 slice 的長度和容量是 0。 向slice添加元素: func append(s []T, vs ...T) []T append 的第一個參數 s 是一個類型為 T 的數組,append 的結果是一個包含原 slice 所有元素加上新添加的元素的 slice,如果 s 的底層數組太小,而不能容納所有值時,會分配一個更大的數組,返回的 slice 會指向這個新分配的數組。 range: for 循環的 range 格式可以對 slice 或者 map 進行迭代循環。

package main import "fmt"  var pow = []int{1, 2, 4, 8, 16, 32, 64, 128} func main() {     for i, v := range pow {         fmt.Printf("2**%d = %d\n", i, v)     } } 

可以通過賦值給 _ 來忽略序號和值,如果只需要索引值,去掉“, value”的部分即可。

func main() {     pow := make([]int, 10)     for i := range pow {         pow[i] = 1 << uint(i)     }     for _, value := range pow {         fmt.Printf("%d\n", value)     } } 

map:map 在使用之前必須用 make 而不是 new 來創建;值為 nil 的 map 是空的,并且不能賦值。

type Vertex struct {     Lat, Long float64 }  var m map[string]Vertex  func main() {     m = make(map[string]Vertex)     m["Bell Labs"] = Vertex{         40.68433, -74.39967,     }     fmt.Println(m["Bell Labs"]) } 

map 的文法跟結構體文法相似,不過必須有鍵名。

var m = map[string]Vertex{     "Bell Labs": Vertex{         40.68433, -74.39967,     },     "Google": Vertex{         37.42202, -122.08408,     }, } 

如果頂級的類型只有類型名的話,可以在文法的元素中省略鍵名。

var m = map[string]Vertex{     "Bell Labs": {40.68433, -74.39967},     "Google":    {37.42202, -122.08408}, } 

修改 map: 在 map m 中插入或修改一個元素:m[key] = elem 獲得元素:elem = m[key] 刪除元素:delete(m, key) 通過雙賦值檢測某個鍵存在:elem, ok = m[key] 如果 key 在 m 中,ok 為 true 。否則, ok 為 false,并且 elem 是 map 的元素類型的零值,同樣的,當從 map 中讀取某個不存在的鍵時,結果是 map 的元素類型的零值。

函數值:函數也是值。

package main import (     "fmt"     "math" )  func main() {     hypot := func(x, y float64) float64 {         return math.Sqrt(x*x + y*y)     }     fmt.Println(hypot(3, 4)) } 

函數的閉包:這個意思簡單點就是以函數作為返回值。 Go 函數可以是閉包的。閉包是一個函數值,它來自函數體的外部的變量引用。 函數可以對這個引用值進行訪問和賦值;換句話說這個函數被“綁定”在這個變量上。

package main  import "fmt"  func adder() func(int) int {     sum := 0     return func(x int) int {         sum += x         return sum     } }  func main() {     pos, neg := adder(), adder()     for i := 0; i < 10; i++ {         fmt.Println(             pos(i),             neg(-2*i),         )     } } 

posted on 2016-10-19 22:20 楊粼波 閱讀(480) 評論(0)  編輯 收藏 引用

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            在线亚洲观看| 影音先锋亚洲精品| 亚洲午夜在线观看| 亚洲日本aⅴ片在线观看香蕉| 久久久久久香蕉网| 亚洲国产一区在线| 亚洲国产成人精品女人久久久| 美国三级日本三级久久99| 亚洲国产一区在线| 日韩亚洲在线观看| 国产精品日韩专区| 久久最新视频| 欧美a级片网站| 亚洲一区二区三区在线视频| 亚洲亚洲精品在线观看| 激情综合在线| 91久久精品久久国产性色也91| 欧美视频第二页| 美腿丝袜亚洲色图| 欧美日韩视频不卡| 欧美一级片在线播放| 久久婷婷国产综合国色天香| 最新国产の精品合集bt伙计| 在线亚洲免费视频| 国产欧美日韩在线播放| 亚洲福利专区| 国产精品一区二区三区四区 | 久久影院午夜论| 日韩亚洲不卡在线| 羞羞色国产精品| 99av国产精品欲麻豆| 午夜精品成人在线| 99精品热视频| 久久久国产精彩视频美女艺术照福利| 日韩一级大片在线| 久久久91精品国产| 亚洲欧美日韩国产成人| 美女脱光内衣内裤视频久久影院| 亚洲欧美日韩国产中文| 牛牛影视久久网| 欧美一区在线视频| 欧美日韩亚洲一区二区| 欧美激情一区二区三级高清视频| 国产精品美女久久久| 欧美国产日韩视频| 激情成人亚洲| 亚洲综合大片69999| 一本久久青青| 美女国产一区| 老司机免费视频一区二区三区 | 久久成人18免费网站| 亚洲欧美色一区| 欧美精品自拍| 亚洲高清色综合| 亚洲高清一区二| 久久xxxx精品视频| 久久本道综合色狠狠五月| 欧美午夜大胆人体| 亚洲欧洲在线播放| 亚洲人午夜精品| 欧美成人免费小视频| 蜜臀久久99精品久久久久久9| 国产情人节一区| 午夜精品福利电影| 久久国产高清| 国产一区二区三区免费在线观看| 亚洲专区在线| 欧美一区二区啪啪| 国产乱码精品一区二区三区忘忧草 | 亚洲精品一二三区| 亚洲人成啪啪网站| 欧美aaaaaaaa牛牛影院| 亚洲大胆女人| 国内精品**久久毛片app| 性伦欧美刺激片在线观看| 校园激情久久| 国内精品久久久久影院色| 久久av一区| 亚洲福利小视频| 亚洲精品一级| 亚洲视频在线一区观看| 欧美天堂亚洲电影院在线观看| 宅男噜噜噜66国产日韩在线观看| 一区二区高清视频| 国产精品久久久久久久久久ktv| 中文亚洲字幕| 久久青草久久| 日韩亚洲欧美精品| 欧美午夜精品久久久| 亚洲一区二区三区四区在线观看| 久久精品国产第一区二区三区| 黑人巨大精品欧美一区二区小视频| 久久久久一区二区三区| 亚洲欧洲精品一区| 午夜精品久久久久久久99樱桃| 国产视频在线观看一区二区| 久久看片网站| 一本色道久久99精品综合| 欧美影院成人| 亚洲三级免费观看| 国产精品久久久久久久app| 久久精品电影| 日韩午夜视频在线观看| 久久国产欧美精品| 日韩视频在线免费| 国产美女一区二区| 欧美激情aⅴ一区二区三区| 亚洲永久视频| 亚洲国产成人不卡| 久久成人国产精品| 99re这里只有精品6| 国产日韩精品综合网站| 欧美全黄视频| 久久久精品999| 亚洲综合二区| 亚洲精品少妇30p| 可以免费看不卡的av网站| 亚洲天堂免费观看| 亚洲美女中文字幕| 狠狠色丁香久久婷婷综合_中| 欧美日韩一区二区三区在线| 欧美在线首页| 亚洲女人天堂成人av在线| 亚洲国产99精品国自产| 老鸭窝91久久精品色噜噜导演| 亚洲一区制服诱惑| 日韩亚洲精品在线| 禁断一区二区三区在线| 国产日韩欧美一区在线 | 久久精品国产亚洲5555| 亚洲在线播放| 亚洲午夜视频在线| 亚洲最快最全在线视频| 亚洲国产高清在线| 欧美高清视频免费观看| 久久午夜av| 久久久精品999| 久久精品伊人| 久久久av毛片精品| 久久精品国产第一区二区三区| 午夜精品久久久久久久| 亚洲欧美日韩国产中文在线| 亚洲午夜在线| 性色av香蕉一区二区| 亚洲一区二区三区四区视频| 亚洲天堂av在线免费| 亚洲午夜免费视频| 亚洲一区二区三| 亚洲一区图片| 亚洲制服av| 久久高清国产| 欧美 日韩 国产精品免费观看| 亚洲午夜免费福利视频| 欧美国产日产韩国视频| 免费一级欧美片在线观看| 裸体一区二区三区| 欧美精品一区在线播放| 欧美人交a欧美精品| 欧美日韩在线观看一区二区三区| 欧美日韩视频在线一区二区| 国产精品捆绑调教| 国产午夜精品久久久| 一区福利视频| 99综合在线| 欧美在线地址| 欧美xxx在线观看| 99riav1国产精品视频| 亚洲特黄一级片| 久久久久九九视频| 欧美日韩成人| 国产在线精品一区二区夜色| 亚洲第一区在线| 亚洲性图久久| 老司机亚洲精品| 亚洲精品乱码视频| 欧美激情中文字幕乱码免费| 久久夜色精品国产噜噜av| 猫咪成人在线观看| 亚洲精品综合精品自拍| 中文欧美在线视频| 午夜精品亚洲| 久久久久久久网| 欧美激情亚洲视频| 国产精品男女猛烈高潮激情 | 午夜精品久久久久影视| 久久精品夜色噜噜亚洲aⅴ| 久久这里有精品视频| 欧美日韩国产另类不卡| 国产美女精品免费电影| 亚洲国产成人久久综合| 在线观看福利一区| 一区二区三区四区五区视频| 久久国产精品黑丝| 亚洲高清视频一区二区| 亚洲欧美国产精品专区久久| 欧美本精品男人aⅴ天堂| 国产精品看片你懂得| 亚洲欧洲视频在线| 欧美jizzhd精品欧美巨大免费| 亚洲日本精品国产第一区|