mirror of https://github.com/golang/go.git
Merge 16f22f78ca into 49cdf0c42e
This commit is contained in:
commit
3ddca43a58
|
|
@ -580,6 +580,15 @@ func (p *printer) marshalValue(val reflect.Value, finfo *fieldInfo, startTemplat
|
|||
|
||||
// marshalAttr marshals an attribute with the given name and value, adding to start.Attr.
|
||||
func (p *printer) marshalAttr(start *StartElement, name Name, val reflect.Value) error {
|
||||
// Dereference or skip nil pointer, interface values.
|
||||
switch val.Kind() {
|
||||
case reflect.Pointer, reflect.Interface:
|
||||
if val.IsNil() {
|
||||
return nil
|
||||
}
|
||||
val = val.Elem()
|
||||
}
|
||||
|
||||
if val.CanInterface() && val.Type().Implements(marshalerAttrType) {
|
||||
attr, err := val.Interface().(MarshalerAttr).MarshalXMLAttr(name)
|
||||
if err != nil {
|
||||
|
|
@ -626,15 +635,6 @@ func (p *printer) marshalAttr(start *StartElement, name Name, val reflect.Value)
|
|||
}
|
||||
}
|
||||
|
||||
// Dereference or skip nil pointer, interface values.
|
||||
switch val.Kind() {
|
||||
case reflect.Pointer, reflect.Interface:
|
||||
if val.IsNil() {
|
||||
return nil
|
||||
}
|
||||
val = val.Elem()
|
||||
}
|
||||
|
||||
// Walk slices.
|
||||
if val.Kind() == reflect.Slice && val.Type().Elem().Kind() != reflect.Uint8 {
|
||||
n := val.Len()
|
||||
|
|
|
|||
|
|
@ -343,6 +343,10 @@ type MarshalerStruct struct {
|
|||
Foo MyMarshalerAttrTest `xml:",attr"`
|
||||
}
|
||||
|
||||
type IMarshalerStruct struct {
|
||||
Foo interface{} `xml:",attr"`
|
||||
}
|
||||
|
||||
type InnerStruct struct {
|
||||
XMLName Name `xml:"testns outer"`
|
||||
}
|
||||
|
|
@ -1252,6 +1256,11 @@ var marshalTests = []struct {
|
|||
ExpectXML: `<MarshalerStruct Foo="hello world"></MarshalerStruct>`,
|
||||
Value: &MarshalerStruct{},
|
||||
},
|
||||
{
|
||||
ExpectXML: `<IMarshalerStruct Foo="hello world"></IMarshalerStruct>`,
|
||||
Value: &IMarshalerStruct{Foo: &MyMarshalerAttrTest{}},
|
||||
MarshalOnly: true,
|
||||
},
|
||||
{
|
||||
ExpectXML: `<outer xmlns="testns" int="10"></outer>`,
|
||||
Value: &OuterStruct{IntAttr: 10},
|
||||
|
|
|
|||
Loading…
Reference in New Issue