使用包和测试
Go天生就是为了支持良好的项目管理体验而设计的
1、包,go项目和文件名没有关系,和src下目录结构有关
go使用包来管理接口、结构体、方法和变量
包名一般和文件目录名相同,如果不同,构建、安装会以代码包名为准,但是生成的构建文件是以目录名命名的。
一个目录下不能有不同包名的代码文件
下面通过案例介绍
1)、go项目结构通常如下:
我本地GOPATH路径为F:\goLangStudy\demo,已经设置了环境变量。
bin中是编译后的可执行文件
pkg中是编译后的包文件
src中是源码目录
其中bin和pkg文件夹如果没有,go会自动创建
2)、在src文件夹下创建文件结构如下
3)、math.go和math_pkg.go文件使用同一个包,最终会被编译到一个二进制包文件math.a中;此处可说明文件名可以和包名不一样
math_pkg.go文件如下:
package math func Add(a, b int) int { return a + b } func Substract(a, b int) int { return a - b }
math.go文件如下:
package math func Multiply(a, b int) int { return a * b } func Divide(a, b int) int { if b == 0 { panic("Can not divided by zero") } return a / b }
4)、一个项目只能有一个main包,main包相对src的目录结构就对应执行go install main包目录
main.go文件如下(import中math是net.duokr/math源码包别名):
package main import ( "fmt" math "net.duokr/math" ) func main() { var a = 100 var b = 200 fmt.Println("Add demo:", math.Add(a, b)) fmt.Println("Substract demo:",math.Substract(a,b)) fmt.Println("Multiply demo:",math.Multiply(a,b)) fmt.Println("Divide demo:",math.Divide(a,b)) }
5)、编写一个脚本文件,省的每次去执行多行同样的命令,build.bat文件如下(我本地配置了环境变量,就把设置GOPATH那段注释了):
@echo off rem set GOPATH=GOPATH;F:\goLangStudy\demo set GOBIN=F:\goLangStudy\demo\bin go build net.duokr\math go build main.go go install main
在src文件夹下,执行完脚本后,目录结构如下(src文件夹下会有个main.exe,是由go build main.go生成):
可以通过go run命令执行main.go;也可以直接运行bin下的bin.exe,查看结果
2、src下的main文件夹不是必须的,main包的文件名也不一定叫main.go,下面更改后如下
3、测试代码编写
在math文件夹下创建math_test.go文件,编写测试代码,在当前测试文件所在路径下执行go test命令,会自动执行以_test.go结尾的文件中Test开头的函数,并且测试函数参数为
math_test.go代码如下
package math import( "testing" "fmt" ) func TestAdd(t *testing.T){ var a=100 var b=200 var val=Add(a,b) if val!=a+b{ t.Error("Test Case [","TestAdd","] Failed") }else{ fmt.Println("Add Method Pass") } } func TestSub(t *testing.T){ var a=100 var b=200 var val=Substract(a,b) if val!=a-b{ t.Error("Test Case [","TestAdd","] Failed") }else{ fmt.Println("Substract Method Pass") } } func TestDemo(t *testing.T){ fmt.Println("测试代码") } func testDemo(t *testing.T){ fmt.Println("不是测试代码") } func TessDemo(t *testing.T){ fmt.Println("不是测试代码") }