| // run | |
| // Copyright 2021 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package main | |
| type S struct{ | |
| m1Called, m2Called bool | |
| } | |
| func (s *S) M1(int) (int, int) { | |
| s.m1Called = true | |
| return 0, 0 | |
| } | |
| func (s *S) M2(int) (int, int) { | |
| s.m2Called = true | |
| return 0, 0 | |
| } | |
| type C struct { | |
| calls []func(int) (int, int) | |
| } | |
| func makeC() Funcs { | |
| return &C{} | |
| } | |
| func (c *C) Add(fn func(int) (int, int)) Funcs { | |
| c.calls = append(c.calls, fn) | |
| return c | |
| } | |
| func (c *C) Call() { | |
| for _, fn := range c.calls { | |
| fn(0) | |
| } | |
| } | |
| type Funcs interface { | |
| Add(func(int) (int, int)) Funcs | |
| Call() | |
| } | |
| func main() { | |
| s := &S{} | |
| c := makeC().Add(s.M1).Add(s.M2) | |
| c.Call() | |
| if !s.m1Called || !s.m2Called { | |
| panic("missed method call") | |
| } | |
| } |