Понимание интерфейса внутри интерфейса (встроенный интерфейс) - PullRequest
0 голосов
/ 01 июля 2018

Я пытался понять встраивание интерфейса с помощью следующего кода.

У меня есть следующее:

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

что мне нужно сделать?

Также, пожалуйста, объясните мне, как этот интерфейс работает в Голанге.

1 Ответ

0 голосов
/ 01 июля 2018

В этом определении:

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

Ваш MyprojectV1alpha1Interface встраивает интерфейс SamplesGetter.

Встраивание интерфейса в другой интерфейс означает, что все методы встроенного интерфейса (SamplesGetter) могут вызываться через интерфейс встраивания (MyprojectV1alpha1Interface).

Это означает, что вы можете вызывать любой из методов SamplesGetter для любого объекта, который реализует MyprojectV1alpha1Interface.

Таким образом, как только вы получите объект MyprojectV1alpha1Interface в вашей переменной temp, вы можете вызвать метод Samples (с подходящим namespace, который я не могу угадать из кода, который вы разместили):

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

...