code: func InitWithOptions(conf interface{}, opts Options) error {
  	value := reflect.ValueOf(conf)
  	if value.Kind() != reflect.Ptr {
  		return ErrNotAPointer
  	}
  
  	elem := value.Elem()
  
  	ctx := context{
  		name:            opts.Prefix,
  		optional:        opts.AllOptional,
  		leaveNil:        opts.LeaveNil,
  		allowUnexported: opts.AllowUnexported,
  	}
  	switch elem.Kind() {
  	case reflect.Ptr:
  		if elem.IsNil() {
  			elem.Set(reflect.New(elem.Type().Elem()))
  		}
  		_, err := readStruct(elem.Elem(), &ctx)
  		return err
  	case reflect.Struct:
  		_, err := readStruct(elem, &ctx)
  		return err
  	default:
  		return ErrInvalidValueKind
  	}
  }
docs: // InitWithOptions reads the configuration from environment variables and populates the conf object.
  // conf must be a pointer.