Support the "mapstructure:" tag on structs for custom keys
diff --git a/mapstructure.go b/mapstructure.go
index 53d632f..344bb7f 100644
--- a/mapstructure.go
+++ b/mapstructure.go
@@ -210,6 +210,11 @@
 		fieldType := valType.Field(i)
 		fieldName := fieldType.Name
 
+		tagValue := fieldType.Tag.Get("mapstructure")
+		if tagValue != "" {
+			fieldName = tagValue
+		}
+
 		rawMapVal := dataVal.MapIndex(reflect.ValueOf(fieldName))
 		if !rawMapVal.IsValid() {
 			// Do a slower search by iterating over each key and
diff --git a/mapstructure_test.go b/mapstructure_test.go
index f131397..663f520 100644
--- a/mapstructure_test.go
+++ b/mapstructure_test.go
@@ -33,6 +33,10 @@
 	Value []Basic
 }
 
+type Tagged struct {
+	Value string `mapstructure:"foo"`
+}
+
 func TestBasicTypes(t *testing.T) {
 	t.Parallel()
 
@@ -318,7 +322,7 @@
 	}
 }
 
-func TestNontStructValue(t *testing.T) {
+func TestNonStructValue(t *testing.T) {
 	t.Parallel()
 
 	result := 42
@@ -333,6 +337,25 @@
 	}
 }
 
+func TestTagged(t *testing.T) {
+	t.Parallel()
+
+	input := map[string]interface{}{
+		"foo": "bar",
+	}
+
+	var result Tagged
+	err := Decode(input, &result)
+	if err != nil {
+		t.Errorf("unexpected error: %s", err)
+		t.FailNow()
+	}
+
+	if result.Value != "bar" {
+		t.Errorf("value should be 'bar', got: %#v", result.Value)
+	}
+}
+
 func testSliceInput(t *testing.T, input map[string]interface{}, expected *Slice) {
 	var result Slice
 	err := Decode(input, &result)