• go 语言的一个赋值操作


     最近在看client-go源码,在源码的 oolscachesstore.go文件中有一行代码不得其解(如下标黄内容),它将一个struct赋值给了一个interface

    type Store interface {
        Add(obj interface{}) error
        Update(obj interface{}) error
        Delete(obj interface{}) error
        List() []interface{}
        ListKeys() []string
        Get(obj interface{}) (item interface{}, exists bool, err error)
        GetByKey(key string) (item interface{}, exists bool, err error)
    
        // Replace will delete the contents of the store, using instead the
        // given list. Store takes ownership of the list, you should not reference
        // it after calling this function.
        Replace([]interface{}, string) error
        Resync() error
    }
    
    type cache struct {
        // cacheStorage bears the burden of thread safety for the cache
        cacheStorage ThreadSafeStore
        // keyFunc is used to make the key for objects stored in and retrieved from items, and
        // should be deterministic.
        keyFunc KeyFunc
    }
    
    var _ Store = &cache{}

    google搜索后没有得到结果,在stackoverflow上提交了一个问题golang syntax in client-go,很快就得到了回答(老外自由时间果然比较多^^),“var _ Store = &cache{}”的作用是强制要求cache结构实现Store接口。

    做个测试,TestSt实现了TestIf接口中的一个方法write,但由于没有实现read,则其并没有实现TestIf接口

    下述代码是可以运行的

    package main
    
    import "fmt"
    
    type TestIf interface {
        write(w string)
        read()
    }
    
    type TestSt struct {
    
    }
    
    func (t *TestSt)write(w string){
        fmt.Println("write")
    }
    
    func main() {
        fmt.Println(111)
    }

    但下述是不可以运行的

    package main
    
    import "fmt"
    
    type TestIf interface {
        write(w string)
        read()
    }
    
    type TestSt struct {
    
    }
    
    func (t *TestSt)write(w string){
        fmt.Println("write")
    }

    var _ TestIf=&TestSt{}
    func main() { 
    fmt.Println(
    111)
    }

    报出的错误如下:

    Cannot use '&TestSt{}' (type *TestSt) as type TestIf in assignment Type does not implement 'TestIf' as some methods are missing: read() more... (Ctrl+F1)

    该语法实际就是实现了某结构必须实现某接口的强制要求

  • 相关阅读:
    第六章 装饰模式
    第二章 策略模式
    第一章 简单工厂模式
    HTTPS-post请求
    import&export
    Flask(Jinja2) 服务端模板注入漏洞vulhub
    MySQL UDF提权 过程及注意事项
    centos7 安装jdk1.8.0_271 以及错误解决
    WEB、FTP服务器所有响应码解释(超详细)
    Wolf CMS后台文件上传getshell并提权
  • 原文地址:https://www.cnblogs.com/charlieroro/p/11023704.html
Copyright © 2020-2023  润新知