func (f *Fuzzer) Fuzz(obj interface{}) bool {
	v := reflect.ValueOf(obj)
	if v.Kind() != reflect.Ptr {
		panic("needed ptr!")
	}
	v = v.Elem()
	fc := &fuzzerContext{fuzzer: f}
	fc.doFuzz(v, "")
	return fc.failed
}
Fuzz recursively fills all of obj's fields with something random
package fuzz
import (
	"fmt"
	"math/rand"
	"reflect"
	"strconv"
	"strings"
	"time"
)
type Fuzzer struct {
	r         *rand.Rand
	failRatio float64
}
func randomInt(min, max int) int {
	return min + rand.Intn(max-min)
}
func New() *Fuzzer {
	return NewWithSeed(time.Now().UnixNano())
}
func NewWithSeed(seed int64) *Fuzzer {
	f := &Fuzzer{
		r: rand.New(rand.NewSource(seed)),
	}
	return f
}
func (f *Fuzzer) SetFailureRatio(failRatio float64) {
	f.failRatio = failRatio
}