go1.18 memo

2022-03-16

Table of Contents

  1. Mar 16
    1. Generic types support
    2. Fuzz is build-in support
    3. workspace is supported

Mar 16

Go 1.18 released

Generic types support

tutorial

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.