代码之家  ›  专栏  ›  技术社区  ›  Invictus

了解接口内部接口(嵌入式接口)

  •  6
  • Invictus  · 技术社区  · 6 年前

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

    我有以下资料:

    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()
    

    现在,如果我想调用

    sampleinterface的创建功能

    我需要做什么?

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

    1 回复  |  直到 6 年前
        1
  •  6
  •   eugenioy    6 年前

    在这个定义中:

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

    你的 MyprojectV1alpha1Interface 嵌入 SamplesGetter 接口。

    在另一个接口中嵌入一个接口意味着嵌入接口的所有方法( 取样吸气剂 )可以通过嵌入接口调用( MyProjectv1Alpha1接口 )中。

    这意味着您可以调用 取样吸气剂 任何实现 MyProjectv1Alpha1接口 是的。

    所以一旦你得到一个 MyProjectv1Alpha1接口 你的 temp 变量,您可以调用 Samples 方法(使用合适的 namespace ,从你发布的代码中我猜不出来):

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

    sampleInt 然后会有一个 SampleInterface 对象,这样您就可以调用 Create 函数使用 样品 变量:

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

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

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

    https://gobyexample.com/interfaces

    推荐文章