Есть такой код.
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`.