Table of Contents
Mar 16
Go 1.18 released
Generic types support
func Foo[K comparable, C int32 | float32] (m map[K]C, args... any) C {
//code
}
- new declarations: any, comparable type constraint for type arguments
- new operator: ~ for type declaration
Fuzz is build-in support
tutorial fuzzTest generate random test input cases to fuzzTarget func
go test -fuzz=Fuzz -fuzztime 10s (-run=xxx)
**fuzzTest run forever by default, need -fuzztime option**
func FuzzReverse(f *testing.F) {
testcases := []string{"Hello, world", " ", "!12345"}
for _, tc := range testcases {
f.Add(tc) // Use f.Add to provide a seed corpus
}
f.Fuzz(func(t *testing.T, orig string) {
rev, revErr := Reverse(orig)
if revErr != nil {
t.Skip(revErr)
}
doubleRev, dRevErr := Reverse(rev)
if dRevErr != nil {
t.Skip(revErr)
}
t.Logf("Number of runes: orig=%d, rev=%d, doubleRev=%d", utf8.RuneCountInString(orig), utf8.RuneCountInString(rev), utf8.RuneCountInString(doubleRev))
if orig != doubleRev {
t.Errorf("Before: %q, after: %q", orig, doubleRev)
}
if utf8.ValidString(orig) && !utf8.ValidString(rev) {
t.Errorf("Reverse produced invalid UTF-8 string %q", rev)
}
})
}
workspace is supported
tutorial 在module的上级目录run: go work init xx, 生成go.work,定义本地module,取代了 go.mod中的 go version 和 package redirect.
