github.com/yanyiwu/go@v0.0.0-20150106053140-03d6637dbb7f/test/interface/receiver.go (about)

     1  // run
     2  
     3  // Copyright 2009 The Go Authors. All rights reserved.
     4  // Use of this source code is governed by a BSD-style
     5  // license that can be found in the LICENSE file.
     6  
     7  // Test Implicit methods for embedded types and
     8  // mixed pointer and non-pointer receivers.
     9  
    10  package main
    11  
    12  type T int
    13  
    14  var nv, np int
    15  
    16  func (t T) V() {
    17  	if t != 42 {
    18  		panic(t)
    19  	}
    20  	nv++
    21  }
    22  
    23  func (t *T) P() {
    24  	if *t != 42 {
    25  		println(t, *t)
    26  		panic("fail")
    27  	}
    28  	np++
    29  }
    30  
    31  type V interface {
    32  	V()
    33  }
    34  type P interface {
    35  	P()
    36  	V()
    37  }
    38  
    39  type S struct {
    40  	T
    41  }
    42  
    43  type SP struct {
    44  	*T
    45  }
    46  
    47  func main() {
    48  	var t T
    49  	var v V
    50  	var p P
    51  
    52  	t = 42
    53  
    54  	t.P()
    55  	t.V()
    56  
    57  	v = t
    58  	v.V()
    59  
    60  	p = &t
    61  	p.P()
    62  	p.V()
    63  
    64  	v = &t
    65  	v.V()
    66  
    67  	//	p = t	// ERROR
    68  	var i interface{} = t
    69  	if _, ok := i.(P); ok {
    70  		println("dynamic i.(P) succeeded incorrectly")
    71  		panic("fail")
    72  	}
    73  
    74  	//	println("--struct--");
    75  	var s S
    76  	s.T = 42
    77  	s.P()
    78  	s.V()
    79  
    80  	v = s
    81  	s.V()
    82  
    83  	p = &s
    84  	p.P()
    85  	p.V()
    86  
    87  	v = &s
    88  	v.V()
    89  
    90  	//	p = s	// ERROR
    91  	var j interface{} = s
    92  	if _, ok := j.(P); ok {
    93  		println("dynamic j.(P) succeeded incorrectly")
    94  		panic("fail")
    95  	}
    96  
    97  	//	println("--struct pointer--");
    98  	var sp SP
    99  	sp.T = &t
   100  	sp.P()
   101  	sp.V()
   102  
   103  	v = sp
   104  	sp.V()
   105  
   106  	p = &sp
   107  	p.P()
   108  	p.V()
   109  
   110  	v = &sp
   111  	v.V()
   112  
   113  	p = sp // not error
   114  	p.P()
   115  	p.V()
   116  
   117  	if nv != 13 || np != 7 {
   118  		println("bad count", nv, np)
   119  		panic("fail")
   120  	}
   121  }