話不多說,開學Go

  • 2019 年 10 月 6 日
  • 筆記

開學Go

0.導語

開始入坑Go,學習來自極客時間上的Go從入門到精通。

最近不怎麼更文了,有如下原因:

  • 一個大的項目
  • 一個演算法
  • 機器學習與深度學習特殊原因暫緩
  • 其他等等

對於關注本公眾號的同學,說聲抱歉!大家可以點擊公眾號菜單來選擇自己喜歡的文章,也歡迎後台留言!

1.Go學習

包管理

Go中包實際上就是文件夾!

  • 1.必須是main包 package main
  • 2.必須是main方法:func main
  • 3.文件名不一定是main.go

退出返回值

與其他程式語言的差異:

Go中main函數不支援任何返回值

通過os.Exit來返回狀態

os.Exit(0) 正常退出

os.Exit(-1)異常退出

main函數傳參

main函數不支援傳入參數

func main(arg []string)錯誤!在程式中直接通過os.Args獲取命令行參數

上述例子:

package main  import (      "fmt"      "os"  )  func main() {      /*          light@city:~/server/go_learning/src/ch1$ go run hello.go guangcheng          Hello World! guangcheng      */      if len(os.Args) > 1 {          fmt.Println("Hello World!", os.Args[1])      }      os.Exit(0)  }  

單元測試

如何編寫測試程式?

  • 源碼以_test結尾:xxx_test.go
  • 測試方法名以Test開頭:
func TestXXX(t * testing.T){...}  

單元測試例子:

package try_test  import "testing"  /*  編寫測試程式  1.源碼以_test結尾:xxx_test.go  2.測試方法名以Test開頭:func TestXXX(t * testing.T){...}  */  func TestFirst(t *testing.T) {      t.Log("My first try!")  }  

類型

  • 賦值可以自動類型推斷
  • 在一個賦值語句中可以對多個變數進行同時賦值

常量

常量定義:快速設置連續值

上述例子:

package fib    import (      "testing"  )  //go test -v fib_test.go -timeout 30s  //`-v` 列印出日誌到終端。`-timeout`測試限制時間。  var c int    func TestFibList(t *testing.T) {      //初始化賦值,但沒有使用這些變數,就會編譯錯誤      // var a int = 1      // var b int = 1      // var (      //  a int = 1      //  b     = 1 //類型推斷      // )      a := 1      b := 1      c = 1 //全局變數賦值      //單元測試中一般用Log      // fmt.Print(a)      t.Log(a)      for i := 0; i < 5; i++ {          // fmt.Print(" ", b)          t.Log(" ", b)            tmp := a          a = b          b = tmp + a      }      // fmt.Println()  }  func TestExchange(t *testing.T) {      a := 1      b := 2      // tmp := a      // a = b      // b = tmp      a, b = b, a //一句對多個變數賦值      t.Log(a, b)  }  

類型轉化:

  • 1.Go語言不允許隱式類型轉換
  • 2.別名和原有類型也不能進行隱式轉換

類型的預定義值

1.math.MaxInt64  2.math.MaxFloat64  3.math.MaxUint32  

指針類型:

  • 1.不支援指針運算
  • 2.string是值類型,其默認的初始值為空字元串,而不是nil

上述例子:

package type_test  import (      "testing"  )  type MyInt int64  func TestImplicit(t *testing.T) {      // var a int = 1      var a int32 = 1      var b int64      //不支援隱式類型轉換      // b = a // cannot use a (type int) as type int64 in assignment      // b = a //cannot use a (type int32) as type int64 in assignment      //可以顯式轉換      b = int64(a)      var c MyInt      //別名和原有類型也不能進行隱式轉換      // b = c //cannot use c (type MyInt) as type int64 in assignment      t.Log(a, b, c)      t.Log(a, b)  }  func TestPoint(t *testing.T) {      a := 1      aPtr := &a      // aPtr += 1 不支援指針運算      t.Log(a, aPtr)      t.Logf("%T %T", a, aPtr) //int *int  }  //string是值類型,其默認的初始值為空字元串,而不是nil  func TestString(t *testing.T) {      var s string      t.Log("*" + s + "*") //**      t.Log(len(s))        //0  }