zoukankan      html  css  js  c++  java
  • 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)

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

  • 相关阅读:
    Aibabelx-shop 大型微服务架构系列实战之技术选型
    龙应台:中年人的迷惘,比年轻人的更可怕!
    劝进篇
    高并发与多线程的关系、区别、高并发的技术方案
    redis常用知识
    Lucene全文检索入门使用
    大数据综合案例-网站日志分析
    python数据类型
    Tornado
    flask-sqlalchemy用法详解
  • 原文地址:https://www.cnblogs.com/charlieroro/p/11023704.html
Copyright © 2011-2022 走看看