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)

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

  • 相关阅读:
    Swift 正式开源, 包括 Swift 核心库和包管理器
    Swift 3 新特性
    iOS10 CoreData新特性
    iOS各个版本的新特性介绍
    iOS WKWebView详解
    Swift XML解析库
    ios辅助功能之voiceover实战
    iOS 内存管理机制和循环引用处理方法
    Swift 关键字汇总
    Swift 自动布局框架-SnapKit
  • 原文地址:https://www.cnblogs.com/charlieroro/p/11023704.html
Copyright © 2011-2022 走看看