话不多说,开学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  }