Go語言似乎是個偏執狂,犧牲了不必要的靈活性,帶來一些強制的編程風格和約定。比如:
- 無任何形式的Makefile,模塊就是目錄、包就是目錄、編譯配制就是目錄!
- 不光目錄被用上了,文件名還能指定用途。文件名后綴為_test.go的都是單元測試文件,_linux32.go就是32位linux特定的代碼。
- 不光文件名被用上了,函數名還有特定用途。在單元測試文件中,測試函數以Test開頭。以大寫字母開頭的變量、類型和函數是外部可見的,小寫字母開頭的變量、類型和函數是外部不可見的。
類似的約定也不好說是go語言首創,在一些文件格式中也有類似規范。但是我暫時不知道到有什么其它編程語言對編程風格這么帶強制性。
對於單元測試,假設有如下calc.go文件:
package calc
func Add(a,b int) int {
return a +b
}
func Max(a,b int) (ret int) {
ret = a
if b > a {
ret = b
}
return
}
func Min(a,b int) (ret int) {
ret = a
if b < a {
ret = b
}
return
}
有如下測試代碼calc_test.go:
func Add(a,b int) int {
return a +b
}
func Max(a,b int) (ret int) {
ret = a
if b > a {
ret = b
}
return
}
func Min(a,b int) (ret int) {
ret = a
if b < a {
ret = b
}
return
}
package calc
import (
"testing"
)
type calcTest struct {
a,b,ret int
}
var addTests = []calcTest{
calcTest{ 4, 6, 10},
calcTest{ 5, 6, 11},
calcTest{ 8, - 10, - 2},
}
func TestAdd(t *testing.T) {
for _,v : = range addTests {
ret : = Add(v.a,v.b)
if ret != v.ret {
t.Errorf( "%d add %d,want %d,but get %d",v.a,v.b,v.ret,ret)
}
}
}
func TestMax(t *testing.T){
a,b : = 100, 300
ret : = Max(a,b)
if ret != b {
t.Errorf( "%d is bigger than %d",b,a)
}
}
func TestMin(t *testing.T) {
a,b : = 100, 300
ret : = Min(a,b)
if ret != a {
t.Errorf( "%d is smaller than %d",a,b)
}
}
執行go test 得到如下結果:
import (
"testing"
)
type calcTest struct {
a,b,ret int
}
var addTests = []calcTest{
calcTest{ 4, 6, 10},
calcTest{ 5, 6, 11},
calcTest{ 8, - 10, - 2},
}
func TestAdd(t *testing.T) {
for _,v : = range addTests {
ret : = Add(v.a,v.b)
if ret != v.ret {
t.Errorf( "%d add %d,want %d,but get %d",v.a,v.b,v.ret,ret)
}
}
}
func TestMax(t *testing.T){
a,b : = 100, 300
ret : = Max(a,b)
if ret != b {
t.Errorf( "%d is bigger than %d",b,a)
}
}
func TestMin(t *testing.T) {
a,b : = 100, 300
ret : = Min(a,b)
if ret != a {
t.Errorf( "%d is smaller than %d",a,b)
}
}
PASS
ok _ /home /liangdi /Desktop /test /go /testing 0. 008
在calc.go中設計一個邏輯錯誤,把 func Min(a,b int) ret int 改為:
ok _ /home /liangdi /Desktop /test /go /testing 0. 008
func Min(a,b
int) (ret
int) {
ret = a
//邏輯錯誤
if b > a {
ret = b
}
return
}
執行go test的結果為:
ret = a
//邏輯錯誤
if b > a {
ret = b
}
return
}
--
- FAIL
: TestMin (
0.00 seconds)
calc_test.go : 38 : 100 is smaller than 300
FAIL
exit status 1
FAIL _ /home /liangdi /Desktop /test /go /testing 0. 005s
calc_test.go : 38 : 100 is smaller than 300
FAIL
exit status 1
FAIL _ /home /liangdi /Desktop /test /go /testing 0. 005s