struct 内嵌 interface

今天看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 作为入参,并能正常输出。


struct 内嵌 interface
https://fatwang1.github.io/2024/12/26/2024122600/
作者
衣云乘风
发布于
2024年12月26日
许可协议