1// run 2 3// Copyright 2021 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 7package main 8 9type S struct{ 10 m1Called, m2Called bool 11} 12 13func (s *S) M1(int) (int, int) { 14 s.m1Called = true 15 return 0, 0 16} 17 18func (s *S) M2(int) (int, int) { 19 s.m2Called = true 20 return 0, 0 21} 22 23type C struct { 24 calls []func(int) (int, int) 25} 26 27func makeC() Funcs { 28 return &C{} 29} 30 31func (c *C) Add(fn func(int) (int, int)) Funcs { 32 c.calls = append(c.calls, fn) 33 return c 34} 35 36func (c *C) Call() { 37 for _, fn := range c.calls { 38 fn(0) 39 } 40} 41 42type Funcs interface { 43 Add(func(int) (int, int)) Funcs 44 Call() 45} 46 47func main() { 48 s := &S{} 49 c := makeC().Add(s.M1).Add(s.M2) 50 c.Call() 51 if !s.m1Called || !s.m2Called { 52 panic("missed method call") 53 } 54} 55