Go 筆記之程式結構

pardon110發表於2019-10-26

同其它語言一樣,Go也有順序,分支,迴圈三大程式結構,只不過它更精煉。

順序

  • if 條件判斷(許初始化變數)
    • 條件判斷語句裡面允許宣告一個變數,該變數的作用域只能在該條件邏輯塊內
  • goto 無條件跳轉

    • 用goto 跳轉到必須在當前函式內定義的標籤
    • 標籤名是大小寫敏感的。

          func myFunc() {
              i := 0
          Here:   // 這行的第一個詞,以冒號結束作為標籤
              println(i)
              i++
              goto Here   // 跳轉到 Here 去
          }
      

迴圈

  • for
    • 迴圈讀取資料,可作while控制邏輯(注意 golang中無while語句)
          sum := 1
          for sum < 1000 {
              sum += sum
          }
    • 迭代操作
      • for 配合 range 可以用於讀取 slice 和 map 的資料
      • break 和 continue 還可以跟著標號,用來跳到多重迴圈中的外層迴圈
    • 標號語句必須緊接在迴圈的頭部。標號語句不能用在非迴圈語句的前面

分支

  • switch

    • 表示式不必是常量或整數
    • 執行的過程從上至下,直到找到匹配項
    • 如果 switch 沒有表示式,它會匹配 true。
    • switch 預設相當於每個 case 最後帶有 break,匹配成功跳出整個switch,可以使用 fallthrough 強制執行後面的 case 程式碼。

          i := 10
          switch i {
          case 1:
              fmt.Println("i is equal to 1")
          case 2, 3, 4:
              fmt.Println("i is equal to 2, 3 or 4")
          case 10:
              fmt.Println("i is equal to 10")
              fallthrough
          default:
              fmt.Println("All I know is that i is an integer")
          }
      

函式

  • 特點

    • 支援多值返回,命名返回值,必須宣告型別
    • 函式可以有一個或者多個引數,每個引數後面帶有型別,透過,分隔
    • 可命名返回引數的變數,若函式是匯出建議命名返回值

          func SumAndProduct(A, B int) (add int, Multiplied int) {
              add = A+B
              Multiplied = A*B
              return
          }
      
          // 支援變參
          func myfunc(arg ...int) {}
          type testInt func(int) bool // 宣告瞭一個函式型別
      
  • 傳值 vs 傳指標

    • 傳參實際上是傳值,其值可以是變數的值,也是可以是變數的地址,即指標
    • 變數在記憶體中是存放於一定地址上的,修改變數實際是修改變數地址處的記憶體
    • 傳指標使得多個函式能操作同一個物件。
    • 傳指標比較輕量級 (8bytes),只是傳記憶體地址,指標傳遞體積大的結構體
    • 若用引數值傳遞的話, 在每次 copy 上面就會花費相對較多的系統開銷(記憶體和時間)
    • Go 語言中 channel,slice,map這三種型別的實現機制類似指標,所以可以直接傳遞,而不用取地址後傳遞指標

關鍵字

  • defer規則
    • 多個defer呼叫 defer,那麼 defer 是採用後進先出模式
    • defer 後指定的函式會在函式退出前呼叫
    • 當函式執行到最後時,這些 defer 語句會按照逆序執行,最後該函式返回。
  • 函式可作為值型別,常用在寫通用介面
    • panic Recover
    • main init
      • init 函式 能夠應用於所有的 package,可選
      • main 函式(只能應用於 package main,必選)
      • 這兩個函式在定義時不能有任何的引數和返回值。
      • 程式的初始化和執行都起始於 main 包
      • 流程
        1. main匯入包
        2. 對匯入包內的常量和變數進行初始化
        3. 執行匯入包內的init函式
        4. 對main包中的包級常量和變數進行初始化,執行main包init,main函式
  • 關鍵字列表
    • defer 用於類似解構函式
    • go 用於併發
    • select 用於選擇不同型別的通訊
    • interface 用於定義介面
    • struct 用於定義抽象資料型別
    • chan 用於 channel 通訊
    • type 用於宣告自定義型別
    • map 用於宣告 map 型別資料
    • range 用於讀取 slice、map、channel 資料

import

  • GOROOT 環境變數指定目錄下去載入該模組
              // 當前檔案同一目錄的 model 目錄,但是不建議這種方式來 import
              import "./model"
              // 絕對路徑 載入 gopath/src/shorturl/model 模組
              import "shorturl/model"
  • import 簡化行為 - 點 省略字首的包名 - 別名 - _ 呼叫包裡面的 init 函式

        import (
            // 即呼叫 fmt.Println("hello world") 可以省略的寫成 Println("hello world")
            . "fmt"
        )
    
        import(
            // 即可 f.Println("hello world")
            f "fmt"
        )
    
        import (
            "database/sql"
            // 呼叫了該包內的init函式,但不對其它內容進行匯入處理
            _ "github.com/ziutek/mymysql/godrv"
        )
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章