github.com/switchupcb/yaegi@v0.10.2/_test/addr2.go (about)

     1  package main
     2  
     3  import (
     4  	"encoding/xml"
     5  	"errors"
     6  	"fmt"
     7  )
     8  
     9  type Email struct {
    10  	Where string `xml:"where,attr"`
    11  	Addr  string
    12  }
    13  
    14  func f(r interface{}) error {
    15  	return withPointerAsInterface(&r)
    16  }
    17  
    18  func withPointerAsInterface(r interface{}) error {
    19  	_ = (r).(*interface{})
    20  	rp, ok := (r).(*interface{})
    21  	if !ok {
    22  		return errors.New("cannot assert to *interface{}")
    23  	}
    24  	em, ok := (*rp).(*Email)
    25  	if !ok {
    26  		return errors.New("cannot assert to *Email")
    27  	}
    28  	em.Where = "work"
    29  	em.Addr = "bob@work.com"
    30  	return nil
    31  }
    32  
    33  func ff(s string, r interface{}) error {
    34  	return xml.Unmarshal([]byte(s), r)
    35  }
    36  
    37  func fff(s string, r interface{}) error {
    38  	return xml.Unmarshal([]byte(s), &r)
    39  }
    40  
    41  func main() {
    42  	data := `
    43  		<Email where='work'>
    44  			<Addr>bob@work.com</Addr>
    45  		</Email>
    46  	`
    47  	v := Email{}
    48  	err := f(&v)
    49  	fmt.Println(err, v)
    50  
    51  	vv := Email{}
    52  	err = ff(data, &vv)
    53  	fmt.Println(err, vv)
    54  
    55  	vvv := Email{}
    56  	err = ff(data, &vvv)
    57  	fmt.Println(err, vvv)
    58  }
    59  
    60  // Output:
    61  // <nil> {work bob@work.com}
    62  // <nil> {work bob@work.com}
    63  // <nil> {work bob@work.com}