7

我试图用下面的代码理解接口嵌入。

我有以下内容:

type MyprojectV1alpha1Interface interface {
    RESTClient() rest.Interface
    SamplesGetter
}

// SamplesGetter has a method to return a SampleInterface.
// A group's client should implement this interface.
type SamplesGetter interface {
    Samples(namespace string) SampleInterface
}

// SampleInterface has methods to work with Sample resources.
type SampleInterface interface {
    Create(*v1alpha1.Sample) (*v1alpha1.Sample, error)
    Update(*v1alpha1.Sample) (*v1alpha1.Sample, error)
    Delete(name string, options *v1.DeleteOptions) error
    DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error
    Get(name string, options v1.GetOptions) (*v1alpha1.Sample, error)
    List(opts v1.ListOptions) (*v1alpha1.SampleList, error)
    Watch(opts v1.ListOptions) (watch.Interface, error)
    Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.Sample, err error)
    SampleExpansion
}

现在,如果我有以下情况:

func returninterface() MyprojectV1alpha1Interface {
//does something and returns me MyprojectV1alpha1Interface
}
temp := returninterface()

现在,如果我想调用 MyprojectV1alpha1Interface

创建 SampleInterface 函数

我需要做什么?

另外,请解释一下这个接口在 Golang 中是如何工作的。

4

1 回答 1

10

在这个定义中:

type MyprojectV1alpha1Interface interface {
    RESTClient() rest.Interface
    SamplesGetter
}

MyprojectV1alpha1Interface嵌入的SamplesGetter界面。

将一个接口嵌入另一个接口意味着嵌入接口 ( ) 的所有方法SamplesGetter都可以通过嵌入接口 ( ) 调用MyprojectV1alpha1Interface

这意味着您可以调用任何SamplesGetter实现MyprojectV1alpha1Interface.

因此,一旦您在变量中获得了一个MyprojectV1alpha1Interface对象,您就可以调用该方法(使用合适的 ,我无法从您发布的代码中猜到):tempSamplesnamespace

sampleInt := temp.Samples("namespace here")

sampleInt然后将有一个SampleInterface对象,因此您可以Create使用您的变量调用该函数sampleInt

sample, err := sampleInt.Create(<you should use a *v1alpha1.Sample here>)

有关接口如何工作的更多详细信息,我建议您查看官方规范和示例:

https://golang.org/ref/spec#Interface_types

https://gobyexample.com/interfaces

于 2018-07-01T03:20:34.317 回答