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) | |
} | |
} |