Как назначить указатель на интерфейс в Go - PullRequest
0 голосов
/ 09 мая 2020
package main

import "fmt"

type intr interface {
    String() string
}

type bar struct{}

func (b *bar) String() string {
    return "bar"
}

type foo struct {
    bar *intr
}

func main() {
    bar1 := bar{}
    foo1 := foo{bar: &bar1} 
    fmt.Println(foo1)
}

Я получаю ошибку времени компиляции:

не может использовать & bar1 (type * bar) как тип * intr в значении поля: * intr - это указатель на интерфейс, а не на интерфейс

Почему произошла эта ошибка? Как присвоить foo.bar?

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Вы назначаете его указателю интерфейса. После изменения типа поля на интерфейс он будет работать:

type foo struct {
    bar intr
}

Указатели на интерфейсы нужны довольно редко.

0 голосов
/ 09 мая 2020

Uber- go руководство по стилю «указатели на интерфейсы» содержит точный ответ на ваш вопрос,

Вам почти никогда не понадобится указатель на интерфейс. Вы должны передавать интерфейсы как значения - базовые данные по-прежнему могут быть указателем. Интерфейс - это два поля: указатель на некоторую c информацию о типе. Вы можете думать об этом как о «типе». И указатель данных. Если сохраненные данные являются указателем, они сохраняются напрямую. Если сохраненные данные являются значением, то сохраняется указатель на значение. Если вы хотите, чтобы методы интерфейса изменяли базовые данные, вы должны использовать указатель.

Я рекомендую познакомиться с ним как можно скорее,

Надеюсь, это поможет

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