Есть ли у golang такой оператор, как «as» (C#) - PullRequest
0 голосов
/ 20 января 2020

Кодовый лог c как ниже:

func (c *Auth) ensureCredential() (azcore, error) {
    _, err = c.build(authData)
}

func (c *Auth) build(authData []byte) (*Client, error) {
return NewClient()
}

Код C#, который я хочу скопировать

public async Task test()
{
            var auth = new Auth();
            var inner = await _cre(auth);

            // This part code I want to copy 
            Client client = inner as Client
            Assert some values equals Client's fileds
}

public async Task<azcore> _credential(Auth provider)
{
            await provider.EnsureCredential(IsAsync, default);
            return (azcore)typeof(Auth).GetField("_cre", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(provider);
}

Оба типа Auth и Client интерфейс навесного оборудования azcore. Я хочу разрешить Auth как Client, чтобы проверить некоторые значения в Auth, равно ли это поле Client. Эти значения в Auth будут назначены полям Client в соответствии с моим кодом logi c.

Заранее спасибо.

1 Ответ

0 голосов
/ 21 января 2020

В Go интерфейсы реализованы неявно.

Вы можете определить интерфейс с получателями, необходимыми для извлечения значений, которые вы хотите сравнить.

type Azcore interface {
    SomeValue() int         // This is a getter
    SomeOtherValue() string // This is a getter
}

Затем вы можете объявить эти методы типа Client

type Client struct {
    Value      int
    OtherValue string
    ExtraValue float64
}

func (c *Client) SomeValue() int {
    return c.Value
}

func (c *Client) SomeOtherValue() string {
    return c.OtherValue
}

и, наконец, объявляют "те же" методы для типа Auth

type Auth struct {
    Value        int
    SpecialValue string
}

func (a *Auth) SomeValue() int {
    return a.Value
}

func (a *Auth) SomeOtherValue() string {
    return a.SpecialValue
}

Затем можно использовать тип Azcore в функциях, как параметр или как результат конвертации

func areEquals(a, b Azcore) bool {
    return a.SomeValue() == b.SomeValue() && a.SomeOtherValue() == b.SomeOtherValue()
}

func (a *Auth) AsAzcore() Azcore {
    return a
}

func (c *Client) AsAzcore() Azcore {
    return c
}

Регистрация детская площадка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...