diff --git a/flags_test.go b/flags_test.go
index 5489278..5bffca3 100644
--- a/flags_test.go
+++ b/flags_test.go
@@ -22,7 +22,7 @@
 		"endpoint": "/public",
 	}
 
-	for name, _ := range testValues {
+	for name := range testValues {
 		testValues[name] = flagSet.String(name, "", "test")
 	}
 
diff --git a/util.go b/util.go
index fe6cb45..5f93d65 100644
--- a/util.go
+++ b/util.go
@@ -29,12 +29,12 @@
 	"gopkg.in/yaml.v2"
 )
 
-// Denotes failing to parse configuration file.
+// ConfigParseError denotes failing to parse configuration file.
 type ConfigParseError struct {
 	err error
 }
 
-// Returns the formatted configuration error.
+// Error returns the formatted configuration error.
 func (pe ConfigParseError) Error() string {
 	return fmt.Sprintf("While parsing config: %s", pe.err.Error())
 }
@@ -68,10 +68,10 @@
 	p, err := filepath.Abs(inPath)
 	if err == nil {
 		return filepath.Clean(p)
-	} else {
-		jww.ERROR.Println("Couldn't discover absolute path")
-		jww.ERROR.Println(err)
 	}
+
+	jww.ERROR.Println("Couldn't discover absolute path")
+	jww.ERROR.Println(err)
 	return ""
 }
 
@@ -107,29 +107,6 @@
 	return os.Getenv("HOME")
 }
 
-func findCWD() (string, error) {
-	serverFile, err := filepath.Abs(os.Args[0])
-
-	if err != nil {
-		return "", fmt.Errorf("Can't get absolute path for executable: %v", err)
-	}
-
-	path := filepath.Dir(serverFile)
-	realFile, err := filepath.EvalSymlinks(serverFile)
-
-	if err != nil {
-		if _, err = os.Stat(serverFile + ".exe"); err == nil {
-			realFile = filepath.Clean(serverFile + ".exe")
-		}
-	}
-
-	if err == nil && realFile != serverFile {
-		path = filepath.Dir(realFile)
-	}
-
-	return path, nil
-}
-
 func unmarshallConfigReader(in io.Reader, c map[string]interface{}, configType string) error {
 	buf := new(bytes.Buffer)
 	buf.ReadFrom(in)
diff --git a/viper.go b/viper.go
index bad121e..bc1bf5e 100644
--- a/viper.go
+++ b/viper.go
@@ -52,40 +52,40 @@
 // RemoteConfig is optional, see the remote package
 var RemoteConfig remoteConfigFactory
 
-// Denotes encountering an unsupported
+// UnsupportedConfigError denotes encountering an unsupported
 // configuration filetype.
 type UnsupportedConfigError string
 
-// Returns the formatted configuration error.
+// Error returns the formatted configuration error.
 func (str UnsupportedConfigError) Error() string {
 	return fmt.Sprintf("Unsupported Config Type %q", string(str))
 }
 
-// Denotes encountering an unsupported remote
+// UnsupportedRemoteProviderError denotes encountering an unsupported remote
 // provider. Currently only etcd and Consul are
 // supported.
 type UnsupportedRemoteProviderError string
 
-// Returns the formatted remote provider error.
+// Error returns the formatted remote provider error.
 func (str UnsupportedRemoteProviderError) Error() string {
 	return fmt.Sprintf("Unsupported Remote Provider Type %q", string(str))
 }
 
-// Denotes encountering an error while trying to
+// RemoteConfigError denotes encountering an error while trying to
 // pull the configuration from the remote provider.
 type RemoteConfigError string
 
-// Returns the formatted remote provider error
+// Error returns the formatted remote provider error
 func (rce RemoteConfigError) Error() string {
 	return fmt.Sprintf("Remote Configurations Error: %s", string(rce))
 }
 
-// Denotes failing to find configuration file.
+// ConfigFileNotFoundError denotes failing to find configuration file.
 type ConfigFileNotFoundError struct {
 	name, locations string
 }
 
-// Returns the formatted configuration error.
+// Error returns the formatted configuration error.
 func (fnfe ConfigFileNotFoundError) Error() string {
 	return fmt.Sprintf("Config File %q Not Found in %q", fnfe.name, fnfe.locations)
 }
@@ -159,7 +159,7 @@
 	onConfigChange func(fsnotify.Event)
 }
 
-// Returns an initialized Viper instance.
+// New returns an initialized Viper instance.
 func New() *Viper {
 	v := new(Viper)
 	v.keyDelim = "."
@@ -220,11 +220,11 @@
 	SecretKeyring() string
 }
 
-// Universally supported extensions.
-var SupportedExts []string = []string{"json", "toml", "yaml", "yml", "properties", "props", "prop", "hcl"}
+// SupportedExts are universally supported extensions.
+var SupportedExts = []string{"json", "toml", "yaml", "yml", "properties", "props", "prop", "hcl"}
 
-// Universally supported remote providers.
-var SupportedRemoteProviders []string = []string{"etcd", "consul"}
+// SupportedRemoteProviders are universally supported remote providers.
+var SupportedRemoteProviders = []string{"etcd", "consul"}
 
 func OnConfigChange(run func(in fsnotify.Event)) { v.OnConfigChange(run) }
 func (v *Viper) OnConfigChange(run func(in fsnotify.Event)) {
@@ -270,7 +270,7 @@
 	}()
 }
 
-// Explicitly define the path, name and extension of the config file
+// SetConfigFile explicitly defines the path, name and extension of the config file
 // Viper will use this and not check any of the config paths
 func SetConfigFile(in string) { v.SetConfigFile(in) }
 func (v *Viper) SetConfigFile(in string) {
@@ -279,7 +279,7 @@
 	}
 }
 
-// Define a prefix that ENVIRONMENT variables will use.
+// SetEnvPrefix defines a prefix that ENVIRONMENT variables will use.
 // E.g. if your prefix is "spf", the env registry
 // will look for env. variables that start with "SPF_"
 func SetEnvPrefix(in string) { v.SetEnvPrefix(in) }
@@ -301,7 +301,7 @@
 // rewriting keys many things, Ex: Get('someKey') -> some_key
 // (cammel case to snake case for JSON keys perhaps)
 
-// getEnv s a wrapper around os.Getenv which replaces characters in the original
+// getEnv is a wrapper around os.Getenv which replaces characters in the original
 // key. This allows env vars which have different keys then the config object
 // keys
 func (v *Viper) getEnv(key string) string {
@@ -311,11 +311,11 @@
 	return os.Getenv(key)
 }
 
-// Return the file used to populate the config registry
+// ConfigFileUsed returns the file used to populate the config registry
 func ConfigFileUsed() string            { return v.ConfigFileUsed() }
 func (v *Viper) ConfigFileUsed() string { return v.configFile }
 
-// Add a path for Viper to search for the config file in.
+// AddConfigPath adds a path for Viper to search for the config file in.
 // Can be called multiple times to define multiple search paths.
 func AddConfigPath(in string) { v.AddConfigPath(in) }
 func (v *Viper) AddConfigPath(in string) {
@@ -455,8 +455,7 @@
 	return v
 }
 
-// Viper is essentially repository for configurations
-// Get can retrieve any value given the key to use
+// Get can retrieve any value given the key to use.
 // Get has the behavior of returning the value associated with the first
 // place from where it is set. Viper will check in the following order:
 // override, flag, env, config file, key/value store, default
@@ -529,7 +528,7 @@
 	return val
 }
 
-// Returns new Viper instance representing a sub tree of this instance
+// Sub returns new Viper instance representing a sub tree of this instance.
 func Sub(key string) *Viper { return v.Sub(key) }
 func (v *Viper) Sub(key string) *Viper {
 	subv := New()
@@ -537,78 +536,77 @@
 	if reflect.TypeOf(data).Kind() == reflect.Map {
 		subv.config = cast.ToStringMap(data)
 		return subv
-	} else {
-		return nil
 	}
+	return nil
 }
 
-// Returns the value associated with the key as a string
+// GetString returns the value associated with the key as a string.
 func GetString(key string) string { return v.GetString(key) }
 func (v *Viper) GetString(key string) string {
 	return cast.ToString(v.Get(key))
 }
 
-// Returns the value associated with the key as a boolean
+// GetBool returns the value associated with the key as a boolean.
 func GetBool(key string) bool { return v.GetBool(key) }
 func (v *Viper) GetBool(key string) bool {
 	return cast.ToBool(v.Get(key))
 }
 
-// Returns the value associated with the key as an integer
+// GetInt returns the value associated with the key as an integer.
 func GetInt(key string) int { return v.GetInt(key) }
 func (v *Viper) GetInt(key string) int {
 	return cast.ToInt(v.Get(key))
 }
 
-// Returns the value associated with the key as an integer
+// GetInt64 returns the value associated with the key as an integer.
 func GetInt64(key string) int64 { return v.GetInt64(key) }
 func (v *Viper) GetInt64(key string) int64 {
 	return cast.ToInt64(v.Get(key))
 }
 
-// Returns the value associated with the key as a float64
+// GetFloat64 returns the value associated with the key as a float64.
 func GetFloat64(key string) float64 { return v.GetFloat64(key) }
 func (v *Viper) GetFloat64(key string) float64 {
 	return cast.ToFloat64(v.Get(key))
 }
 
-// Returns the value associated with the key as time
+// GetTime returns the value associated with the key as time.
 func GetTime(key string) time.Time { return v.GetTime(key) }
 func (v *Viper) GetTime(key string) time.Time {
 	return cast.ToTime(v.Get(key))
 }
 
-// Returns the value associated with the key as a duration
+// GetDuration returns the value associated with the key as a duration.
 func GetDuration(key string) time.Duration { return v.GetDuration(key) }
 func (v *Viper) GetDuration(key string) time.Duration {
 	return cast.ToDuration(v.Get(key))
 }
 
-// Returns the value associated with the key as a slice of strings
+// GetStringSlice returns the value associated with the key as a slice of strings.
 func GetStringSlice(key string) []string { return v.GetStringSlice(key) }
 func (v *Viper) GetStringSlice(key string) []string {
 	return cast.ToStringSlice(v.Get(key))
 }
 
-// Returns the value associated with the key as a map of interfaces
+// GetStringMap returns the value associated with the key as a map of interfaces.
 func GetStringMap(key string) map[string]interface{} { return v.GetStringMap(key) }
 func (v *Viper) GetStringMap(key string) map[string]interface{} {
 	return cast.ToStringMap(v.Get(key))
 }
 
-// Returns the value associated with the key as a map of strings
+// GetStringMapString returns the value associated with the key as a map of strings.
 func GetStringMapString(key string) map[string]string { return v.GetStringMapString(key) }
 func (v *Viper) GetStringMapString(key string) map[string]string {
 	return cast.ToStringMapString(v.Get(key))
 }
 
-// Returns the value associated with the key as a map to a slice of strings.
+// GetStringMapStringSlice returns the value associated with the key as a map to a slice of strings.
 func GetStringMapStringSlice(key string) map[string][]string { return v.GetStringMapStringSlice(key) }
 func (v *Viper) GetStringMapStringSlice(key string) map[string][]string {
 	return cast.ToStringMapStringSlice(v.Get(key))
 }
 
-// Returns the size of the value associated with the given key
+// GetSizeInBytes returns the size of the value associated with the given key
 // in bytes.
 func GetSizeInBytes(key string) uint { return v.GetSizeInBytes(key) }
 func (v *Viper) GetSizeInBytes(key string) uint {
@@ -616,13 +614,13 @@
 	return parseSizeInBytes(sizeStr)
 }
 
-// Takes a single key and unmarshals it into a Struct
+// UnmarshalKey takes a single key and unmarshals it into a Struct.
 func UnmarshalKey(key string, rawVal interface{}) error { return v.UnmarshalKey(key, rawVal) }
 func (v *Viper) UnmarshalKey(key string, rawVal interface{}) error {
 	return mapstructure.Decode(v.Get(key), rawVal)
 }
 
-// Unmarshals the config into a Struct. Make sure that the tags
+// Unmarshal unmarshals the config into a Struct. Make sure that the tags
 // on the fields of the structure are properly set.
 func Unmarshal(rawVal interface{}) error { return v.Unmarshal(rawVal) }
 func (v *Viper) Unmarshal(rawVal interface{}) error {
@@ -638,7 +636,7 @@
 }
 
 // A wrapper around mapstructure.Decode that mimics the WeakDecode functionality
-// while erroring on non existing vals in the destination struct
+// while erroring on non existing vals in the destination struct.
 func weakDecodeExact(input, output interface{}) error {
 	config := &mapstructure.DecoderConfig{
 		ErrorUnused:      true,
@@ -654,8 +652,8 @@
 	return decoder.Decode(input)
 }
 
-// Unmarshals the config into a Struct, erroring if a field is non-existant
-// in the destination struct
+// UnmarshalExact unmarshals the config into a Struct, erroring if a field is nonexistent
+// in the destination struct.
 func (v *Viper) UnmarshalExact(rawVal interface{}) error {
 	err := weakDecodeExact(v.AllSettings(), rawVal)
 
@@ -668,27 +666,27 @@
 	return nil
 }
 
-// Bind a full flag set to the configuration, using each flag's long
+// BindPFlags binds a full flag set to the configuration, using each flag's long
 // name as the config key.
-func BindPFlags(flags *pflag.FlagSet) (err error) { return v.BindPFlags(flags) }
-func (v *Viper) BindPFlags(flags *pflag.FlagSet) (err error) {
+func BindPFlags(flags *pflag.FlagSet) error { return v.BindPFlags(flags) }
+func (v *Viper) BindPFlags(flags *pflag.FlagSet) error {
 	return v.BindFlagValues(pflagValueSet{flags})
 }
 
-// Bind a specific key to a pflag (as used by cobra).
+// BindPFlag binds a specific key to a pflag (as used by cobra).
 // Example (where serverCmd is a Cobra instance):
 //
 //	 serverCmd.Flags().Int("port", 1138, "Port to run Application server on")
 //	 Viper.BindPFlag("port", serverCmd.Flags().Lookup("port"))
 //
-func BindPFlag(key string, flag *pflag.Flag) (err error) { return v.BindPFlag(key, flag) }
-func (v *Viper) BindPFlag(key string, flag *pflag.Flag) (err error) {
+func BindPFlag(key string, flag *pflag.Flag) error { return v.BindPFlag(key, flag) }
+func (v *Viper) BindPFlag(key string, flag *pflag.Flag) error {
 	return v.BindFlagValue(key, pflagValue{flag})
 }
 
-// Bind a full FlagValue set to the configuration, using each flag's long
+// BindFlagValues binds a full FlagValue set to the configuration, using each flag's long
 // name as the config key.
-func BindFlagValues(flags FlagValueSet) (err error) { return v.BindFlagValues(flags) }
+func BindFlagValues(flags FlagValueSet) error { return v.BindFlagValues(flags) }
 func (v *Viper) BindFlagValues(flags FlagValueSet) (err error) {
 	flags.VisitAll(func(flag FlagValue) {
 		if err = v.BindFlagValue(flag.Name(), flag); err != nil {
@@ -698,14 +696,14 @@
 	return nil
 }
 
-// Bind a specific key to a FlagValue.
+// BindFlagValue binds a specific key to a FlagValue.
 // Example(where serverCmd is a Cobra instance):
 //
 //	 serverCmd.Flags().Int("port", 1138, "Port to run Application server on")
 //	 Viper.BindFlagValue("port", serverCmd.Flags().Lookup("port"))
 //
-func BindFlagValue(key string, flag FlagValue) (err error) { return v.BindFlagValue(key, flag) }
-func (v *Viper) BindFlagValue(key string, flag FlagValue) (err error) {
+func BindFlagValue(key string, flag FlagValue) error { return v.BindFlagValue(key, flag) }
+func (v *Viper) BindFlagValue(key string, flag FlagValue) error {
 	if flag == nil {
 		return fmt.Errorf("flag for %q is nil", key)
 	}
@@ -713,12 +711,12 @@
 	return nil
 }
 
-// Binds a Viper key to a ENV variable
-// ENV variables are case sensitive
+// BindEnv binds a Viper key to a ENV variable.
+// ENV variables are case sensitive.
 // If only a key is provided, it will use the env key matching the key, uppercased.
 // EnvPrefix will be used when set when env name is not provided.
-func BindEnv(input ...string) (err error) { return v.BindEnv(input...) }
-func (v *Viper) BindEnv(input ...string) (err error) {
+func BindEnv(input ...string) error { return v.BindEnv(input...) }
+func (v *Viper) BindEnv(input ...string) error {
 	var key, envkey string
 	if len(input) == 0 {
 		return fmt.Errorf("BindEnv missing key to bind to")
@@ -737,10 +735,10 @@
 	return nil
 }
 
-// Given a key, find the value
+// Given a key, find the value.
 // Viper will check in the following order:
-// flag, env, config file, key/value store, default
-// Viper will check to see if an alias exists first
+// flag, env, config file, key/value store, default.
+// Viper will check to see if an alias exists first.
 func (v *Viper) find(key string) interface{} {
 	var val interface{}
 	var exists bool
@@ -783,9 +781,8 @@
 		if val = v.getEnv(envkey); val != "" {
 			jww.TRACE.Println(envkey, "found in environment with val:", val)
 			return val
-		} else {
-			jww.TRACE.Println(envkey, "env value unset:")
 		}
+		jww.TRACE.Println(envkey, "env value unset:")
 	}
 
 	val, exists = v.config[key]
@@ -825,7 +822,7 @@
 	return nil
 }
 
-// Check to see if the key has been set in any of the data locations
+// IsSet checks to see if the key has been set in any of the data locations.
 func IsSet(key string) bool { return v.IsSet(key) }
 func (v *Viper) IsSet(key string) bool {
 	path := strings.Split(key, v.keyDelim)
@@ -845,7 +842,7 @@
 	return val != nil
 }
 
-// Have Viper check ENV variables for all
+// AutomaticEnv has Viper check ENV variables for all.
 // keys set in config, default & flags
 func AutomaticEnv() { v.AutomaticEnv() }
 func (v *Viper) AutomaticEnv() {
@@ -904,12 +901,11 @@
 	if exists {
 		jww.DEBUG.Println("Alias", key, "to", newkey)
 		return v.realKey(newkey)
-	} else {
-		return key
 	}
+	return key
 }
 
-// Check to see if the given key (or an alias) is in the config file
+// InConfig checks to see if the given key (or an alias) is in the config file.
 func InConfig(key string) bool { return v.InConfig(key) }
 func (v *Viper) InConfig(key string) bool {
 	// if the requested key is an alias, then return the proper key
@@ -919,7 +915,7 @@
 	return exists
 }
 
-// Set the default value for this key.
+// SetDefault sets the default value for this key.
 // Default only used when no value is provided by the user via flag, config or ENV.
 func SetDefault(key string, value interface{}) { v.SetDefault(key, value) }
 func (v *Viper) SetDefault(key string, value interface{}) {
@@ -928,9 +924,9 @@
 	v.defaults[key] = value
 }
 
-// Sets the value for the key in the override regiser.
+// Set sets the value for the key in the override regiser.
 // Will be used instead of values obtained via
-// flags, config file, ENV, default, or key/value store
+// flags, config file, ENV, default, or key/value store.
 func Set(key string, value interface{}) { v.Set(key, value) }
 func (v *Viper) Set(key string, value interface{}) {
 	// If alias passed in, then set the proper override
@@ -938,7 +934,7 @@
 	v.override[key] = value
 }
 
-// Viper will discover and load the configuration file from disk
+// ReadInConfig will discover and load the configuration file from disk
 // and key/value stores, searching in one of the defined paths.
 func ReadInConfig() error { return v.ReadInConfig() }
 func (v *Viper) ReadInConfig() error {
@@ -973,7 +969,7 @@
 	return v.MergeConfig(bytes.NewReader(file))
 }
 
-// Viper will read a configuration file, setting existing keys to nil if the
+// ReadConfig will read a configuration file, setting existing keys to nil if the
 // key does not exist in the file.
 func ReadConfig(in io.Reader) error { return v.ReadConfig(in) }
 func (v *Viper) ReadConfig(in io.Reader) error {
@@ -1075,34 +1071,20 @@
 	}
 }
 
-// func ReadBufConfig(buf *bytes.Buffer) error { return v.ReadBufConfig(buf) }
-// func (v *Viper) ReadBufConfig(buf *bytes.Buffer) error {
-// 	v.config = make(map[string]interface{})
-// 	return v.unmarshalReader(buf, v.config)
-// }
-
-// Attempts to get configuration from a remote source
+// ReadRemoteConfig attempts to get configuration from a remote source
 // and read it in the remote configuration registry.
 func ReadRemoteConfig() error { return v.ReadRemoteConfig() }
 func (v *Viper) ReadRemoteConfig() error {
-	err := v.getKeyValueConfig()
-	if err != nil {
-		return err
-	}
-	return nil
+	return v.getKeyValueConfig()
 }
 
 func WatchRemoteConfig() error { return v.WatchRemoteConfig() }
 func (v *Viper) WatchRemoteConfig() error {
-	err := v.watchKeyValueConfig()
-	if err != nil {
-		return err
-	}
-	return nil
+	return v.watchKeyValueConfig()
 }
 
-// Unmarshall a Reader into a map
-// Should probably be an unexported function
+// Unmarshall a Reader into a map.
+// Should probably be an unexported function.
 func unmarshalReader(in io.Reader, c map[string]interface{}) error {
 	return v.unmarshalReader(in, c)
 }
@@ -1118,7 +1100,7 @@
 	insensitiviseMap(v.kvstore)
 }
 
-// retrieve the first found remote configuration
+// Retrieve the first found remote configuration.
 func (v *Viper) getKeyValueConfig() error {
 	if RemoteConfig == nil {
 		return RemoteConfigError("Enable the remote features by doing a blank import of the viper/remote package: '_ github.com/spf13/viper/remote'")
@@ -1135,8 +1117,7 @@
 	return RemoteConfigError("No Files Found")
 }
 
-func (v *Viper) getRemoteConfig(provider *defaultRemoteProvider) (map[string]interface{}, error) {
-
+func (v *Viper) getRemoteConfig(provider RemoteProvider) (map[string]interface{}, error) {
 	reader, err := RemoteConfig.Get(provider)
 	if err != nil {
 		return nil, err
@@ -1145,7 +1126,7 @@
 	return v.kvstore, err
 }
 
-// retrieve the first found remote configuration
+// Retrieve the first found remote configuration.
 func (v *Viper) watchKeyValueConfig() error {
 	for _, rp := range v.remoteProviders {
 		val, err := v.watchRemoteConfig(rp)
@@ -1158,7 +1139,7 @@
 	return RemoteConfigError("No Files Found")
 }
 
-func (v *Viper) watchRemoteConfig(provider *defaultRemoteProvider) (map[string]interface{}, error) {
+func (v *Viper) watchRemoteConfig(provider RemoteProvider) (map[string]interface{}, error) {
 	reader, err := RemoteConfig.Watch(provider)
 	if err != nil {
 		return nil, err
@@ -1167,48 +1148,48 @@
 	return v.kvstore, err
 }
 
-// Return all keys regardless where they are set
+// AllKeys returns all keys regardless where they are set.
 func AllKeys() []string { return v.AllKeys() }
 func (v *Viper) AllKeys() []string {
 	m := map[string]struct{}{}
 
-	for key, _ := range v.defaults {
+	for key := range v.defaults {
 		m[strings.ToLower(key)] = struct{}{}
 	}
 
-	for key, _ := range v.pflags {
+	for key := range v.pflags {
 		m[strings.ToLower(key)] = struct{}{}
 	}
 
-	for key, _ := range v.env {
+	for key := range v.env {
 		m[strings.ToLower(key)] = struct{}{}
 	}
 
-	for key, _ := range v.config {
+	for key := range v.config {
 		m[strings.ToLower(key)] = struct{}{}
 	}
 
-	for key, _ := range v.kvstore {
+	for key := range v.kvstore {
 		m[strings.ToLower(key)] = struct{}{}
 	}
 
-	for key, _ := range v.override {
+	for key := range v.override {
 		m[strings.ToLower(key)] = struct{}{}
 	}
 
-	for key, _ := range v.aliases {
+	for key := range v.aliases {
 		m[strings.ToLower(key)] = struct{}{}
 	}
 
 	a := []string{}
-	for x, _ := range m {
+	for x := range m {
 		a = append(a, x)
 	}
 
 	return a
 }
 
-// Return all settings as a map[string]interface{}
+// AllSettings returns all settings as a map[string]interface{}.
 func AllSettings() map[string]interface{} { return v.AllSettings() }
 func (v *Viper) AllSettings() map[string]interface{} {
 	m := map[string]interface{}{}
@@ -1219,13 +1200,13 @@
 	return m
 }
 
-// Se the filesystem to use to read configuration.
+// SetFs sets the filesystem to use to read configuration.
 func SetFs(fs afero.Fs) { v.SetFs(fs) }
 func (v *Viper) SetFs(fs afero.Fs) {
 	v.fs = fs
 }
 
-// Name for the config file.
+// SetConfigName sets name for the config file.
 // Does not include extension.
 func SetConfigName(in string) { v.SetConfigName(in) }
 func (v *Viper) SetConfigName(in string) {
@@ -1235,7 +1216,7 @@
 	}
 }
 
-// Sets the type of the configuration returned by the
+// SetConfigType sets the type of the configuration returned by the
 // remote source, e.g. "json".
 func SetConfigType(in string) { v.SetConfigType(in) }
 func (v *Viper) SetConfigType(in string) {
@@ -1254,9 +1235,9 @@
 
 	if len(ext) > 1 {
 		return ext[1:]
-	} else {
-		return ""
 	}
+
+	return ""
 }
 
 func (v *Viper) getConfigFile() string {
@@ -1287,8 +1268,8 @@
 	return ""
 }
 
-// search all configPaths for any config file.
-// Returns the first path that exists (and is a config file)
+// Search all configPaths for any config file.
+// Returns the first path that exists (and is a config file).
 func (v *Viper) findConfigFile() (string, error) {
 
 	jww.INFO.Println("Searching for config in ", v.configPaths)
@@ -1302,7 +1283,7 @@
 	return "", ConfigFileNotFoundError{v.configName, fmt.Sprintf("%s", v.configPaths)}
 }
 
-// Prints all configuration registries for debugging
+// Debug prints all configuration registries for debugging
 // purposes.
 func Debug() { v.Debug() }
 func (v *Viper) Debug() {
diff --git a/viper_test.go b/viper_test.go
index fdbe4d9..cf897d6 100644
--- a/viper_test.go
+++ b/viper_test.go
@@ -491,7 +491,7 @@
 		"endpoint": "/public",
 	}
 
-	for name, _ := range testValues {
+	for name := range testValues {
 		testValues[name] = flagSet.String(name, "", "test")
 	}
 
