@kinojs
Начинающий разрабочтик, WEB

Почему структура не имплементирует интерфейс?

Есть такой код.

type Monetary interface {
    GetDecimals() int64
}

type Account interface {
    GetBalance() Monetary
}

type balance struct {
    decimals int64
}

func (b *balance) GetDecimals() int64 {
    return 0
}

type account struct {
    b *balance
}

func (a *account) GetBalance() *balance {
    return a.b
}

func NewAccount() *account {
    return &account{
        b: &balance{},
    }
}

func main() {
    var acc Account = NewAccount()
    fmt.Println(acc)
}


Выдает ошибку:

cannot use NewAccount() (value of type *account) as Account value in variable declaration: *account does not implement Account (wrong type for method GetBalance)
        have GetBalance() *balance
        want GetBalance() Monetary


Но при этом, если я буду запускать такой код, ошибок не будет.

func main() {
    acc := NewAccount()
    b := acc.GetBalance()
    m := (Monetary)(b)
    fmt.Println(acc, m)
}


Я не понимаю, почему так, ведь по идее `*balance` полностью имплементирует интерфейс `Monetary`.
  • Вопрос задан
  • 121 просмотр
Решения вопроса 2
OrlovEvgenii
@OrlovEvgenii
golang developer / DevOps
Ты возвращаешь указатель на структуру *balance вместо того, чтобы возвращать значение, реализующее интерфейс Monetary - а это не соответствует требованиям интерфейса Account, которые указывают, что метод GetBalance() должен возвращать тип, реализующий интерфейс Monetary.

type Account interface {
    GetBalance() Monetary
}

type account struct {
    b Monetary
}

func (a *account) GetBalance() Monetary {
    return a.b
}

func NewAccount() *account {
    return &account{
        b: &balance{},
    }
}

func main() {
    var acc Account = NewAccount()
    fmt.Println(acc)
}
Ответ написан
yellow79
@yellow79
Senior Software Engineer
В определении функции написано, что она возвращает указатель на balance, а согласно интерфейсу Account, она должна возвращать Monetary. Просто поправьте возвращаемое значение в функции GetBalance
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы