func Set(v interface{}, name string, value interface{}) bool {
	field := GetAccessor(v).Fields[name]
	if field == nil {
		return false
	}
	fieldValue := structValue(v).Field(field.Index)
	valueValue := reflect.ValueOf(value)
	if value == nil && field.Type.Kind() == reflect.Ptr {
		valueValue = reflect.Zero(field.Type)
	}
	if fieldValue.Type() != valueValue.Type() {
		return false
	}
	fieldValue.Set(valueValue)
	return true
}
Set will set the specified field with the provided value and return whether
the field has been found and the value has been set.
package stick
import (
	"fmt"
	"reflect"
	"sync"
)
var accessMutex sync.Mutex
var accessCache = map[reflect.Type]*Accessor{}
type Accessible interface {
	GetAccessor(interface{}) *Accessor
}
type Field struct {
	Index int
	Type  reflect.Type
}
type Accessor struct {
	Name   string
	Fields map[string]*Field
}
func Access(v interface{}, ignore ...string) *Accessor {
	typ := structValue(v).Type()
	accessMutex.Lock()
	defer accessMutex.Unlock()
	accessor, ok := accessCache[typ]
	if ok {
		return accessor
	}
	accessor = BuildAccessor(v, ignore...)
	accessCache[typ] = accessor
	return accessor
}
func BuildAccessor(v interface{}, ignore ...string) *Accessor {
	typ := structValue(v).Type()
	accessor := &Accessor{
		Name:   typ.String(),
		Fields: map[string]*Field{},
	}
	for i := 0; i < typ.NumField(); i++ {
		field := typ.Field(i)
		var skip bool
		for _, item := range ignore {
			if item == field.Name {
				skip = true
			}
		}
		if skip {
			continue
		}
		accessor.Fields[field.Name] = &Field{
			Index: i,
			Type:  field.Type,
		}
	}
	return accessor
}
func GetAccessor(v interface{}) *Accessor {
	structValue(v)
	if acc, ok := v.(Accessible); ok {
		return acc.GetAccessor(v)
	}
	return Access(v)
}
func Get(v interface{}, name string) (interface{}, bool) {
	field := GetAccessor(v).Fields[name]
	if field == nil {
		return nil, false
	}
	value := structValue(v).Field(field.Index).Interface()
	return value, true
}
func MustGet(v interface{}, name string) interface{} {
	value, ok := Get(v, name)
	if !ok {
		panic(fmt.Sprintf(`stick: could not get field "%s" on "%s"`, name, GetAccessor(v).Name))
	}
	return value
}
func GetRaw(v interface{}, name string) (reflect.Value, bool) {
	field := GetAccessor(v).Fields[name]
	if field == nil {
		return reflect.Value{}, false
	}
	value := structValue(v).Field(field.Index)
	return value, true
}
func MustGetRaw(v interface{}, name string) reflect.Value {
	value, ok := GetRaw(v, name)
	if !ok {
		panic(fmt.Sprintf(`stick: could not get field "%s" on "%s"`, name, GetAccessor(v).Name))
	}
	return value
}