package main //go:generate mkdir ~/test import ( "fmt" ) func main() { fmt.Println("go generate test finished.") }
在命令行中執行shell
go generate -v -n -x /代碼路徑/main.go
輸出:json
go/code/src/main.go mkdir ~/test
test文件夾也生成了。bash
cmd := exec.Command("hugo", "-t=hyde") cmd.Dir = "D:/work/hugo/mysite" out, err := cmd.CombinedOutput() if err != nil { fmt.Println(err) return } fmt.Println(string(out))
go test internal/config -run=TestKindsString
*_test.go
文件格式化整個項目並將結果寫入文件: gofmt -l -d -w src/abc
函數
golint不能對目錄的子目錄執行,對全部目錄執行的shell方法:測試
find src/push-sms -name "*.go" -exec golint {} \;
採用:go build -ldflags "-s -w"
這種方式編譯。優化
解釋一下參數的意思:ui
-s
去掉符號表(這樣panic時,stack trace就沒有任何文件名/行號信息了,這等價於普通C/C+=程序被strip的效果)命令行
-w
去掉DWARF調試信息,獲得的程序就不能用gdb調試了3d
兩個能夠分開使用調試
參數列表能夠使用下面的語句查看:
go tool compile -help
關閉編譯器代碼優化
go build -gcflags "-N" -o test test.go
關閉函數內聯
go build -gcflags "-l" -o test test.go
同時制定
go build -gcflags "-N -l" -o test test.go
查看編譯優化信息
go build -gcflags "-m" test.go
查看項目引用包
go list -json
查看生成的彙編代碼
package main import "fmt" func main() { fmt.Println(*test()) } func test() *int { x := new(int) *x = 0xAABB return x }
go tool objdump -s "main\.test" test
輸出:
TEXT main.test(SB) /Users/zhangyuchen/tmp/test.go test.go:9 0x20f0 65488b0c25a0080000 GS MOVQ GS:0x8a0, CX test.go:9 0x20f9 483b6110 CMPQ 0x10(CX), SP test.go:9 0x20fd 7639 JBE 0x2138 test.go:9 0x20ff 4883ec18 SUBQ $0x18, SP test.go:9 0x2103 48896c2410 MOVQ BP, 0x10(SP) test.go:9 0x2108 488d6c2410 LEAQ 0x10(SP), BP test.go:10 0x210d 488d054c700800 LEAQ 0x8704c(IP), AX test.go:10 0x2114 48890424 MOVQ AX, 0(SP) test.go:10 0x2118 e8c3c90000 CALL runtime.newobject(SB) test.go:10 0x211d 488b442408 MOVQ 0x8(SP), AX test.go:11 0x2122 48c700bbaa0000 MOVQ $runtime.mapaccess2_fast64+459(SB), 0(AX) test.go:12 0x2129 4889442420 MOVQ AX, 0x20(SP) test.go:12 0x212e 488b6c2410 MOVQ 0x10(SP), BP test.go:12 0x2133 4883c418 ADDQ $0x18, SP test.go:12 0x2137 c3 RET test.go:9 0x2138 e803c90400 CALL runtime.morestack_noctxt(SB) test.go:9 0x213d ebb1 JMP main.test(SB) :-1 0x213f cc INT $0x3