一、前言

结构体断言用于判断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 
  1. 本地文件路径:localpath demo.txt
  2. 远端文件路径: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
}

三、剖析

  1. 将文件路径抽象为一个顶层的 fileSpec 对象
  2. fileSpec 里面有具体的文件路径 File
  3. File 是一个 pathSpec 接口
  4. localpath 与 remotepath 都实现了这个接口,都是 File 实例。

    所以这边可以看出,通过接口 golang 也是可以实现 java 的多态
    func (p localPath) String() string {
     return p.file
    }
    func (p remotePath) String() string {
     return p.file
    }
  5. 具体使用

    // 解析 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)
  6. 断言的具体使用
    对象.(要判断的类型)
  7. 上面步骤 5 的代码是拷贝文件到容器里面的,所以第一个参数只能是 localpath 类型,如果断言出错就代表着用户输入的参数信息有误。

四、小结

列举了 kubectl 里面一小部分代码,介绍了结构体断言的使用,并提到 golang 通过接口实现多态的可能。

点赞(1) 打赏

Comment list 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部