Go天生就是爲了支持良好的項目管理體驗而設計的ide
一、包,go項目和文件名沒有關係,和src下目錄結構有關函數
go使用包來管理接口、結構體、方法和變量測試
包名通常和文件目錄名相同,若是不一樣,構建、安裝會以代碼包名爲準,可是生成的構建文件是以目錄名命名的。ui
一個目錄下不能有不一樣包名的代碼文件spa
下面經過案例介紹設計
1)、go項目結構一般以下:3d
我本地GOPATH路徑爲F:\goLangStudy\demo,已經設置了環境變量。code
bin中是編譯後的可執行文件blog
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,查看結果
二、src下的main文件夾不是必須的,main包的文件名也不必定叫main.go,下面更改後以下
三、測試代碼編寫
在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("不是測試代碼") }