在 docker 源代码库中, image/backend.go 中存在一个接口(interface):
type imageBackend interface {
....
ImagesPrune(pruneFilters filters.Args) (*types.ImagesPruneReport, error)
}
并且,daemon/prune.go中有一个实现:
func (daemon *Daemon) ImagesPrune(pruneFilters filters.Args) (*types.ImagesPruneReport, error) {
... implementation details ...
}
这是否意味着 Daemon
实现 imageBackend
接口(interface)的说法是正确的?
背景: 我试图了解调用 docker system prune cmd 如何调用 daemon.go 中的 ImagesPrune 函数。我可以将代码流程跟踪为:
cli/../system/prune.go -> cli/../prune/prune.go -> cli/../image/prune.go -> client/image_prune.go -> api/server/..image/image_routes.go -> api/server/../image/backend.go -----> ??? ----> daemon/prune.go
我不知道上面的 ???
部分有什么内容。
最佳答案
是的,Daemon
确实实现了imageBackend
接口(interface)(正如评论中指出的,它实际上是实现该接口(interface)的 *Daemon
类型)。全部imageBackend
的方法在daemon
内的各种源代码文件中实现。包(主要是 image_*.go
的)。
在 image_routes.go
postImagesPrune
method is called ,依次 calls the ImagesPrune
方法s.backend
。 s
是指向 imageRouter
实例的指针.
type imageRouter struct {
backend Backend
decoder httputils.ContainerDecoder
routes []router.Route
}
这个imageRouter
实例初始化为 backend
设置为 Daemon
的实例在cmd/dockerd/daemon.go
here 。
所以当 s.backend.ImagesPrune
被调用时,它正在运行 ImagesPrune
Docker Daemon 的方法,正如您上面指出的,位于 daemon/prune.go
中.
关于docker - 戈兰 : Is it safe to say that if a struct implements a method then it satisfies all interfaces that define that method's signature?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43298575/