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