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}