В go, как вы создаете интерфейс, когда методы вызываются * Type? - PullRequest
5 голосов
/ 22 июня 2011

Попытка создать интерфейс, но методы имеют *Type, а не Type получатели

Извинение: было сонно и неправильно прочитал сообщения об ошибках. Я думал, что не могу создать интерфейс БД, хотя на самом деле я его неправильно использовал. Извините за это ... буду более осторожным в будущем!

type Char string

func (*Char) toType(v *string) interface{} {
        if v == nil {
                return (*Char)(nil)
        }
        var s string = *v
        ch := Char(s[0])
        return &ch
}
func (v *Char) toRaw() *string {
        if v == nil {
                return (*string)(nil)
        }
        s := *((*string)(v))
        return &s
}

отсюда я хотел бы интерфейс, который содержит методы toType и toRaw

type DB interface{
        toRaw() *string
        toType(*string) interface{}
}

не работает, так как получатели функций являются указателями. Я говорю это, потому что, когда я пытаюсь использовать это, я получаю ошибку.k

    Char does not implement DB (toRaw method requires pointer receiver)

Есть ли способ создать интерфейс из toType и toRaw, или мне нужно сделать резервную копию, и получатели должны быть самими типами, а не указателями на типы?

Ответы [ 2 ]

5 голосов
/ 22 июня 2011

Если вы определяете методы интерфейса для типа указателя, вы должны передать указатель на методы / функции, ожидающие интерфейс.

4 голосов
/ 22 июня 2011

Я не понимаю, в чем ваша проблема.Да, как вы написали, *Char соответствует интерфейсу DB, а Char - нет.Вы можете либо

  1. изменить свой код так, чтобы методы работали с типом без указателя Char напрямую (что также будет автоматически работать и для *Char)
  2. использовать только*Char когда вам нужно что-то для совместимости с типом DB
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...