github.com/jd-ly/tools@v0.5.7/go/ssa/interp/testdata/ifaceprom.go (about)

     1  package main
     2  
     3  // Test of promotion of methods of an interface embedded within a
     4  // struct.  In particular, this test exercises that the correct
     5  // method is called.
     6  
     7  type I interface {
     8  	one() int
     9  	two() string
    10  }
    11  
    12  type S struct {
    13  	I
    14  }
    15  
    16  type impl struct{}
    17  
    18  func (impl) one() int {
    19  	return 1
    20  }
    21  
    22  func (impl) two() string {
    23  	return "two"
    24  }
    25  
    26  func main() {
    27  	var s S
    28  	s.I = impl{}
    29  	if one := s.I.one(); one != 1 {
    30  		panic(one)
    31  	}
    32  	if one := s.one(); one != 1 {
    33  		panic(one)
    34  	}
    35  	closOne := s.I.one
    36  	if one := closOne(); one != 1 {
    37  		panic(one)
    38  	}
    39  	closOne = s.one
    40  	if one := closOne(); one != 1 {
    41  		panic(one)
    42  	}
    43  
    44  	if two := s.I.two(); two != "two" {
    45  		panic(two)
    46  	}
    47  	if two := s.two(); two != "two" {
    48  		panic(two)
    49  	}
    50  	closTwo := s.I.two
    51  	if two := closTwo(); two != "two" {
    52  		panic(two)
    53  	}
    54  	closTwo = s.two
    55  	if two := closTwo(); two != "two" {
    56  		panic(two)
    57  	}
    58  }