今天看context的代码时,发现了一个这样的写法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| type Context interface { Deadline() (deadline time.Time, ok bool)
Done() <-chan struct{}
Err() error
Value(key any) any }
type valueCtx struct { Context key, val any }
|
仔细看才发现可以通过把 interface 内嵌到 struct 中来达到不实现 interface 的全部 method 就能使用实例指代 interface。
示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
| type Info interface { Name() string Age() int }
type Cow struct { name string Info }
func (c *Cow) Name() string { return c.name }
|
测试代码如下:
1 2 3 4 5 6 7 8 9 10
| func TestName(t *testing.T) { cow := &Cow{ name: "cc", } cl := func(i Info) string { return i.Name() }
t.Log(cl(cow)) }
|
输出:
1 2 3 4
| === RUN TestName interface_in_struct_test.go:15: cc --- PASS: TestName (0.00s) PASS
|
可以清楚看到,Cow 对象没有实现 Info.Age 但是依旧可以使用实例 cow 作为入参,并能正常输出。