話不多說,開學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 }