Go語言基礎學習九-過程式編程一

Go語言基礎學習九-過程式編程一

   首先我們整理一下,我們這一章節需要學習的內容:

   1.go語言的一些語句結構上的基礎知識。

   2.go語言中的類型轉換和類型斷言

   3.go語言中分支語句中(if,switch,select)switch的使用方法包括表達式開關,類型開關的概念,if略過,select下章講

   4.go語言對於json數據的一些處理操作,json的數據的獲取,json數據和結構體的對應填充等

   

   Go語言可以用於寫純過程程序,也可以用於寫純面向對象程序還可以用於寫面向過程和麪向對象相結合的程序。

   語句基礎,Go語言的語法中需要使用分號來作爲上下文中語句的分隔結束符,但實際的go語言程序中我們很少見到分號,因爲編譯器會自動在以標識符,數字字面量,字母字面量,關鍵字等結束的非空行末尾自動加上分號。有兩個地方必須加上分號:

  1.當我們需要在一行中放入一條或多條語句時 

  2.使用原始的for循環結構時。除此之外,我們需要注意到自動插入分號的一個重要結果是一個右大括號無法自成一行:

//正確代碼   

  for i:=0;i<5;i++{

         fmt.Println(i)

        }

//錯誤代碼,無法通過編譯,編譯器會自動往++後面插入一個分號

   for i:=0;i<5;i++

    {

     fmt.Println(i)

     }


類型轉換 result := Type(expression)


類型斷言:Go語言的interface{}類型用於表示空接口,即一個方法集(可調用方法的集合)爲空集的類型的值,由於每一種類型都有一個方法集合包含空的集合,一個interface{}的值用於表示任何Go類型的值。

由於interafce{}的使用,爲了訪問該無類型的底層值,我們可以使用如下兩種方法對該值進行類型斷言,即斷言該interafce{}爲何類型數據:

     1.   result , boolean :=expression.(Type)//安全類型斷言,斷言失敗會反悔零值和false

     2.  result := expression.(Type)//非安全類型斷言,斷言失敗調用內置panic()拋出異常

例子:var i interface{} = 99

         j,ok=i.(int)// 斷言i爲int數據是,返回i和true,否返回0和false。這裏顯然是斷言成功的


分支 :Go語言提供了三種分支語,if , switch , select

          if和C及java用法一致,這裏我就不詳細說明。

           switch表達式開關,在語法上與c和java略有區別,Go語言的switch語句不會自動的向下貫穿,所以不必在每個case子句末尾添加一個break語句。相反我們可以在需要的時候通過顯示地調用fallthrough來達到這個貫穿的目的。switch類型開關則是Go語言特有的。

           表達式開關switch語法:

             switch  statement;expression{//執行statement之後,對expression作判斷

             case expressionList:block1

             …

             case expressionList:blockN

             default:block2


                } 

      如果,switch後沒有可選的expression,則編譯器會假設其表達式的值爲true例如:

     switch {

         case value1<value2:return value1

         case value1>=value2:return value2

        }

     fallthrough使用方法示例:

    switch suffix:=Suffix(file);suffix{

     case “.gz” : return GzipFileList(file)

     case “.tar” : fallthrough

     case “.tar.gz” : fallthrough

     case “.tgz” : TarFileList(file)

     }

   簡寫格式如下:

    switch Suffix(file){

     case “.gz” : return GzipFileList(file)

     case “.tar”,“.tar.gz” ,“.tgz”:

              TarFileList(file)

     }

      類型開關switch語法:

      switch statement;typeSwitchGuard{

         case typeList1 :block1

         …

         case  typeListN:blockN

         default :blockD

        }

   例如:

       switch x.(type) {//這裏類似於類型斷言的格式,但使用的是type關鍵字用於表示任意類型

        case bool :fmt.println(“bool”)

        case float : fmt.println(“float”)

        default : fmt.println(“unknown”)

}


     解析JSON格式的數據,我們將json數據轉換成go語言中的某一數據類型,這可以通過json.Unmarshal()函數來實現,我們向該函數傳入一個結構體指針,如果該結構體與json數據匹配該函數就會將json數據填充到該結構體中,如果我們不知道該json對應哪個結構體,我們可以傳入一個指向interafce{}的指針,這樣就會將json數據填充到一個map[string]interface{}的映射中去。比如下面這個例子:

    JSON :=[]byte{“name”:”David”,”age”:21,”sex”:”boy”}

    var object interface{}

    if err := json.Unmarshal(JSON,&object);err!=nil{//這裏的object就是無類型的interface{}指針自動將son數據轉換成map[string]interface{}類型數據,但是如果我們知道該 json的數據結構,我們可以將相應結構體指針傳入到該函數中去,該函數會幫我們自動填充數據,相當於將json數據填充到一個java的bean類中一樣

        fmt.println(err)

   }else{

        jsonObject:=object.(map.[string]interface{})//類型斷言,成功返回該類型數據

        fat.Println(jsonObjectAsString(jsonObject))//該函數接受map[string]interface{}類型變量並轉換成字符串,該函數的實現我就不展示了。

      }



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章