一、前言
结构体断言用于判断2个对象是否属于同一类型,下面借助 kubectl 中 cp 命令的部分源码进行描述。
二、代码上下文说明
kubectl cp 功能可以将本地文件上传到远端的容器,也可以将远端容器内的文件下载到本地,所以这边涉及到2个路径,该文章也将围绕这2个路径展开讲解。
// 拷贝本地文件到容器
kubectl cp demo.txt default/podname-xxx:demo.txt
// 拷贝容器内文件到本地
kubectl cp default/podname-xxx:demo.txt demo.txt
- 本地文件路径:localpath
demo.txt
- 远端文件路径:remotepath
default/podname-xxx:demo.txt demo.txt
主要源码
type fileSpec struct {
PodName string
PodNamespace string
File pathSpec
}
type pathSpec interface {
String() string
}
type localPath struct {
file string
}
func (p localPath) String() string {
return p.file
}
type remotePath struct {
file string
}
func (p remotePath) String() string {
return p.file
}
三、剖析
- 将文件路径抽象为一个顶层的 fileSpec 对象
- fileSpec 里面有具体的文件路径 File
- File 是一个
pathSpec
接口 localpath 与 remotepath 都实现了这个接口,都是 File 实例。
所以这边可以看出,通过接口 golang 也是可以实现 java 的多态
func (p localPath) String() string { return p.file } func (p remotePath) String() string { return p.file }
具体使用
// 解析 cp 命令的第一个参数转换为 源的 fileSpec 对象 srcSpec, err := extractFileSpec(args[0]) // 解析 cp 命令的第二个参数转换为 目标的 fileSpec 对象 destSpec, err := extractFileSpec(args[1]) // src.File 取出该对象的具体路径信息,并判断是不是 localpath 类型的地址 srcFile := src.File.(localPath) // dist.File 取出该对象的具体路径信息,并判断是不是 remotepath 类型的地址 destFile := dest.File.(remotePath)
- 断言的具体使用
对象.(要判断的类型)
- 上面步骤 5 的代码是拷贝文件到容器里面的,所以第一个参数只能是 localpath 类型,如果断言出错就代表着用户输入的参数信息有误。
四、小结
列举了 kubectl 里面一小部分代码,介绍了结构体断言的使用,并提到 golang 通过接口实现多态的可能。
发表评论 取消回复