@@ -451,23 +451,29 @@ func (p *printer) marshalValue(val reflect.Value, finfo *fieldInfo, startTemplat
451
451
452
452
// Check for marshaler.
453
453
if val .CanInterface () && typ .Implements (marshalerType ) {
454
- return p .marshalInterface (val .Interface ().(Marshaler ), defaultStart (typ , finfo , startTemplate ))
454
+ marshaler , _ := reflect.TypeAssert [Marshaler ](val )
455
+ return p .marshalInterface (marshaler , defaultStart (typ , finfo , startTemplate ))
455
456
}
456
457
if val .CanAddr () {
457
458
pv := val .Addr ()
458
- if pv .CanInterface () && pv .Type ().Implements (marshalerType ) {
459
- return p .marshalInterface (pv .Interface ().(Marshaler ), defaultStart (pv .Type (), finfo , startTemplate ))
459
+ if pv .CanInterface () {
460
+ if marshaler , ok := reflect.TypeAssert [Marshaler ](pv ); ok {
461
+ return p .marshalInterface (marshaler , defaultStart (pv .Type (), finfo , startTemplate ))
462
+ }
460
463
}
461
464
}
462
465
463
466
// Check for text marshaler.
464
467
if val .CanInterface () && typ .Implements (textMarshalerType ) {
465
- return p .marshalTextInterface (val .Interface ().(encoding.TextMarshaler ), defaultStart (typ , finfo , startTemplate ))
468
+ textMarshaler , _ := reflect.TypeAssert [encoding.TextMarshaler ](val )
469
+ return p .marshalTextInterface (textMarshaler , defaultStart (typ , finfo , startTemplate ))
466
470
}
467
471
if val .CanAddr () {
468
472
pv := val .Addr ()
469
- if pv .CanInterface () && pv .Type ().Implements (textMarshalerType ) {
470
- return p .marshalTextInterface (pv .Interface ().(encoding.TextMarshaler ), defaultStart (pv .Type (), finfo , startTemplate ))
473
+ if pv .CanInterface () {
474
+ if textMarshaler , ok := reflect.TypeAssert [encoding.TextMarshaler ](pv ); ok {
475
+ return p .marshalTextInterface (textMarshaler , defaultStart (pv .Type (), finfo , startTemplate ))
476
+ }
471
477
}
472
478
}
473
479
@@ -503,7 +509,7 @@ func (p *printer) marshalValue(val reflect.Value, finfo *fieldInfo, startTemplat
503
509
start .Name .Space , start .Name .Local = xmlname .xmlns , xmlname .name
504
510
} else {
505
511
fv := xmlname .value (val , dontInitNilPointers )
506
- if v , ok := fv . Interface ().( Name ); ok && v .Local != "" {
512
+ if v , ok := reflect. TypeAssert [ Name ]( fv ); ok && v .Local != "" {
507
513
start .Name = v
508
514
}
509
515
}
@@ -581,7 +587,8 @@ func (p *printer) marshalValue(val reflect.Value, finfo *fieldInfo, startTemplat
581
587
// marshalAttr marshals an attribute with the given name and value, adding to start.Attr.
582
588
func (p * printer ) marshalAttr (start * StartElement , name Name , val reflect.Value ) error {
583
589
if val .CanInterface () && val .Type ().Implements (marshalerAttrType ) {
584
- attr , err := val .Interface ().(MarshalerAttr ).MarshalXMLAttr (name )
590
+ marshaler , _ := reflect.TypeAssert [MarshalerAttr ](val )
591
+ attr , err := marshaler .MarshalXMLAttr (name )
585
592
if err != nil {
586
593
return err
587
594
}
@@ -593,20 +600,23 @@ func (p *printer) marshalAttr(start *StartElement, name Name, val reflect.Value)
593
600
594
601
if val .CanAddr () {
595
602
pv := val .Addr ()
596
- if pv .CanInterface () && pv .Type ().Implements (marshalerAttrType ) {
597
- attr , err := pv .Interface ().(MarshalerAttr ).MarshalXMLAttr (name )
598
- if err != nil {
599
- return err
600
- }
601
- if attr .Name .Local != "" {
602
- start .Attr = append (start .Attr , attr )
603
+ if pv .CanInterface () {
604
+ if marshaler , ok := reflect.TypeAssert [MarshalerAttr ](pv ); ok {
605
+ attr , err := marshaler .MarshalXMLAttr (name )
606
+ if err != nil {
607
+ return err
608
+ }
609
+ if attr .Name .Local != "" {
610
+ start .Attr = append (start .Attr , attr )
611
+ }
612
+ return nil
603
613
}
604
- return nil
605
614
}
606
615
}
607
616
608
617
if val .CanInterface () && val .Type ().Implements (textMarshalerType ) {
609
- text , err := val .Interface ().(encoding.TextMarshaler ).MarshalText ()
618
+ textMarshaler , _ := reflect.TypeAssert [encoding.TextMarshaler ](val )
619
+ text , err := textMarshaler .MarshalText ()
610
620
if err != nil {
611
621
return err
612
622
}
@@ -616,13 +626,15 @@ func (p *printer) marshalAttr(start *StartElement, name Name, val reflect.Value)
616
626
617
627
if val .CanAddr () {
618
628
pv := val .Addr ()
619
- if pv .CanInterface () && pv .Type ().Implements (textMarshalerType ) {
620
- text , err := pv .Interface ().(encoding.TextMarshaler ).MarshalText ()
621
- if err != nil {
622
- return err
629
+ if pv .CanInterface () {
630
+ if textMarshaler , ok := reflect.TypeAssert [encoding.TextMarshaler ](pv ); ok {
631
+ text , err := textMarshaler .MarshalText ()
632
+ if err != nil {
633
+ return err
634
+ }
635
+ start .Attr = append (start .Attr , Attr {name , string (text )})
636
+ return nil
623
637
}
624
- start .Attr = append (start .Attr , Attr {name , string (text )})
625
- return nil
626
638
}
627
639
}
628
640
@@ -647,7 +659,8 @@ func (p *printer) marshalAttr(start *StartElement, name Name, val reflect.Value)
647
659
}
648
660
649
661
if val .Type () == attrType {
650
- start .Attr = append (start .Attr , val .Interface ().(Attr ))
662
+ attr , _ := reflect.TypeAssert [Attr ](val )
663
+ start .Attr = append (start .Attr , attr )
651
664
return nil
652
665
}
653
666
@@ -855,7 +868,8 @@ func (p *printer) marshalStruct(tinfo *typeInfo, val reflect.Value) error {
855
868
return err
856
869
}
857
870
if vf .CanInterface () && vf .Type ().Implements (textMarshalerType ) {
858
- data , err := vf .Interface ().(encoding.TextMarshaler ).MarshalText ()
871
+ textMarshaler , _ := reflect.TypeAssert [encoding.TextMarshaler ](vf )
872
+ data , err := textMarshaler .MarshalText ()
859
873
if err != nil {
860
874
return err
861
875
}
@@ -866,15 +880,17 @@ func (p *printer) marshalStruct(tinfo *typeInfo, val reflect.Value) error {
866
880
}
867
881
if vf .CanAddr () {
868
882
pv := vf .Addr ()
869
- if pv .CanInterface () && pv .Type ().Implements (textMarshalerType ) {
870
- data , err := pv .Interface ().(encoding.TextMarshaler ).MarshalText ()
871
- if err != nil {
872
- return err
873
- }
874
- if err := emit (p , data ); err != nil {
875
- return err
883
+ if pv .CanInterface () {
884
+ if textMarshaler , ok := reflect.TypeAssert [encoding.TextMarshaler ](pv ); ok {
885
+ data , err := textMarshaler .MarshalText ()
886
+ if err != nil {
887
+ return err
888
+ }
889
+ if err := emit (p , data ); err != nil {
890
+ return err
891
+ }
892
+ continue
876
893
}
877
- continue
878
894
}
879
895
}
880
896
@@ -902,7 +918,7 @@ func (p *printer) marshalStruct(tinfo *typeInfo, val reflect.Value) error {
902
918
return err
903
919
}
904
920
case reflect .Slice :
905
- if elem , ok := vf . Interface ().([ ]byte ); ok {
921
+ if elem , ok := reflect. TypeAssert [[ ]byte ]( vf ); ok {
906
922
if err := emit (p , elem ); err != nil {
907
923
return err
908
924
}
0 commit comments