Fix a couple of bugs reported by Roger.
diff --git a/encode.go b/encode.go
index fa3ebc6..c7fcdb2 100644
--- a/encode.go
+++ b/encode.go
@@ -142,8 +142,8 @@
 		panic(err)
 	}
 	e.mappingv(tag, func() {
-		for i, info := range fields.List {
-			value := in.Field(i)
+		for _, info := range fields.List {
+			value := in.Field(info.Num)
 			if info.OmitEmpty && isZero(value) {
 				continue
 			}
diff --git a/encode_test.go b/encode_test.go
index fe1c497..f6a0d0f 100644
--- a/encode_test.go
+++ b/encode_test.go
@@ -97,6 +97,13 @@
 				B string
 			} "a,flow"
 		}{struct{ B string }{"c"}}},
+
+	// Unexported field
+	{"a: 1\n",
+		&struct {
+			u int
+			A int
+		}{0, 1}},
 }
 
 func (s *S) TestMarshal(c *C) {
@@ -141,6 +148,22 @@
 	{"_: !foo\n  a: B\n", "!foo", &marshalTaggedIfaceTest},
 }
 
+func (s *S) TestMarshalTypeCache(c *C) {
+	var data []byte
+	var err error
+	func() {
+		type T struct{ A int }
+		data, err = goyaml.Marshal(&T{})
+		c.Assert(err, IsNil)
+	}()
+	func() {
+		type T struct{ B int }
+		data, err = goyaml.Marshal(&T{})
+		c.Assert(err, IsNil)
+	}()
+	c.Assert(string(data), Equals, "b: 0\n")
+}
+
 type typeWithGetter struct {
 	tag   string
 	value interface{}
diff --git a/goyaml.go b/goyaml.go
index 3de01c0..fa288c9 100644
--- a/goyaml.go
+++ b/goyaml.go
@@ -129,7 +129,7 @@
 //     goyaml.Marshal(&T{F: 1}} // Returns "a: 1\nb: 0\n"
 //
 func Marshal(in interface{}) (out []byte, err error) {
-	defer handleErr(&err)
+	//defer handleErr(&err)
 	e := newEncoder()
 	defer e.destroy()
 	e.marshal("", reflect.ValueOf(in))
@@ -155,7 +155,7 @@
 	Flow      bool
 }
 
-var fieldMap = make(map[string]*structFields)
+var fieldMap = make(map[reflect.Type]*structFields)
 var fieldMapMutex sync.RWMutex
 
 type externalPanic string
@@ -165,12 +165,8 @@
 }
 
 func getStructFields(st reflect.Type) (*structFields, error) {
-	path := st.PkgPath()
-	name := st.Name()
-
-	fullName := path + "." + name
 	fieldMapMutex.RLock()
-	fields, found := fieldMap[fullName]
+	fields, found := fieldMap[st]
 	fieldMapMutex.RUnlock()
 	if found {
 		return fields, nil
@@ -243,12 +239,9 @@
 
 	fields = &structFields{fieldsMap, fieldsList[:len(fieldsMap)]}
 
-	if fullName != "." {
-		fieldMapMutex.Lock()
-		fieldMap[fullName] = fields
-		fieldMapMutex.Unlock()
-	}
-
+	fieldMapMutex.Lock()
+	fieldMap[st] = fields
+	fieldMapMutex.Unlock()
 	return fields, nil
 }