code: func (m Map) GetWithType(name string, typ reflect.Type) (interface{}, bool) {
  	value := m[name]
  
  	if value == nil {
  		return nil, true
  	}
  
  	rv := reflect.ValueOf(value)
  	rt := rv.Type()
  
  	if rt.Kind() == reflect.Ptr {
  		rv = rv.Elem()
  		rt = rt.Elem()
  	}
  
  	if !rv.IsValid() {
  		return nil, true
  	}
  
  	if typ.Kind() == reflect.Slice && (rt.Kind() == reflect.Slice || rt.Kind() == reflect.Array) {
  		result := reflect.MakeSlice(typ, rv.Len(), rv.Len())
  		elemTyp := typ.Elem()
  
  		for i := 0; i < rv.Len(); i++ {
  			elem := rv.Index(i)
  			if elem.Kind() == reflect.Interface {
  				elem = elem.Elem()
  			}
  
  			if elem.Type().ConvertibleTo(elemTyp) {
  				result.Index(i).Set(elem.Convert(elemTyp))
  			} else {
  				return nil, false
  			}
  		}
  
  		return result.Interface(), true
  	}
  
  	if !rt.ConvertibleTo(typ) {
  		return nil, false
  	}
  
  	return rv.Convert(typ).Interface(), true
  }
docs: // GetWithType returns value given from given name and type.
  // second return value will only be false if the type of parameter is not convertible to requested type.
  // If value is not convertible to type, it'll return nil, false
  // If value is not exists, it will return nil, true