go 语言的一个赋值操作

Posted charlieroro

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go 语言的一个赋值操作相关的知识,希望对你有一定的参考价值。

 最近在看client-go源码,在源码的\tools\caches\store.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)

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

以上是关于go 语言的一个赋值操作的主要内容,如果未能解决你的问题,请参考以下文章

Go语言操作mysql指南

Go语言之如何给*int32类型赋值

go语言应用程序内存错误,高分悬赏

Go语言数组去重

go语言基础语法

[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础