| package main |
| |
| // Test of promotion of methods of an interface embedded within a |
| // struct. In particular, this test exercises that the correct |
| // method is called. |
| |
| type I interface { |
| one() int |
| two() string |
| } |
| |
| type S struct { |
| I |
| } |
| |
| type impl struct{} |
| |
| func (impl) one() int { |
| return 1 |
| } |
| |
| func (impl) two() string { |
| return "two" |
| } |
| |
| func main() { |
| var s S |
| s.I = impl{} |
| if one := s.I.one(); one != 1 { |
| panic(one) |
| } |
| if one := s.one(); one != 1 { |
| panic(one) |
| } |
| closOne := s.I.one |
| if one := closOne(); one != 1 { |
| panic(one) |
| } |
| closOne = s.one |
| if one := closOne(); one != 1 { |
| panic(one) |
| } |
| |
| if two := s.I.two(); two != "two" { |
| panic(two) |
| } |
| if two := s.two(); two != "two" { |
| panic(two) |
| } |
| closTwo := s.I.two |
| if two := closTwo(); two != "two" { |
| panic(two) |
| } |
| closTwo = s.two |
| if two := closTwo(); two != "two" { |
| panic(two) |
| } |
| } |