Support decoding slices
diff --git a/mapstructure.go b/mapstructure.go
index 536e8c2..1233c73 100644
--- a/mapstructure.go
+++ b/mapstructure.go
@@ -51,6 +51,8 @@
 		return decodeStruct(name, data, val)
 	case reflect.Map:
 		return decodeMap(name, data, val)
+	case reflect.Slice:
+		return decodeSlice(name, data, val)
 	}
 
 	// If we reached this point then we weren't able to decode it
@@ -96,6 +98,12 @@
 	return nil
 }
 
+func decodeSlice(name string, data interface{}, val reflect.Value) error {
+	dataVal := reflect.Indirect(reflect.ValueOf(data))
+	val.Set(dataVal)
+	return nil
+}
+
 func decodeStruct(name string, data interface{}, val reflect.Value) error {
 	dataVal := reflect.Indirect(reflect.ValueOf(data))
 	dataValKind := dataVal.Kind()
diff --git a/mapstructure_test.go b/mapstructure_test.go
index d87d151..7070dd4 100644
--- a/mapstructure_test.go
+++ b/mapstructure_test.go
@@ -19,6 +19,11 @@
 	Vbar Basic
 }
 
+type Slice struct {
+	Vfoo string
+	Vbar []string
+}
+
 func TestBasicTypes(t *testing.T) {
 	t.Parallel()
 
@@ -172,6 +177,28 @@
 	}
 }
 
+func TestSlice(t *testing.T) {
+	t.Parallel()
+
+	inputStringSlice := map[string]interface{}{
+		"vfoo": "foo",
+		"vbar": []string{"foo", "bar", "baz"},
+	}
+
+	inputStringSlicePointer := map[string]interface{}{
+		"vfoo": "foo",
+		"vbar": &[]string{"foo", "bar", "baz"},
+	}
+
+	outputStringSlice := &Slice{
+		"foo",
+		[]string{"foo", "bar", "baz"},
+	}
+
+	testSliceInput(t, inputStringSlice, outputStringSlice)
+	testSliceInput(t, inputStringSlicePointer, outputStringSlice)
+}
+
 func TestInvalidType(t *testing.T) {
 	t.Parallel()
 
@@ -219,3 +246,33 @@
 		t.Errorf("got unexpected error: %s", err)
 	}
 }
+
+func testSliceInput(t *testing.T, input map[string]interface{}, expected *Slice) {
+	var result Slice
+	err := Decode(input, &result)
+	if err != nil {
+		t.Errorf("got error: %s", err)
+		t.FailNow()
+	}
+
+	if result.Vfoo != expected.Vfoo {
+		t.Errorf("Vfoo expected '%s', got '%s'", expected.Vfoo, result.Vfoo)
+	}
+
+	if result.Vbar == nil {
+		t.Errorf("Vbar a slice, got '%#v'", result.Vbar)
+		t.FailNow()
+	}
+
+	if len(result.Vbar) != len(expected.Vbar) {
+		t.Errorf("Vbar length should be %d, got %d", len(expected.Vbar), len(result.Vbar))
+	}
+
+	for i, v := range result.Vbar {
+		if v != expected.Vbar[i] {
+			t.Errorf(
+				"Vbar[%d] should be '%#v', got '%#v'",
+				i, expected.Vbar[i], v)
+		}
+	}
+}