Я пытаюсь понять концепцию интерфейса Go и создать следующий код:ссылка Интерфейс показывает странный выход
package main
import "fmt"
type Failer interface {
Error() string
}
type Succer interface {
Success() string
}
type Result interface {
Failer
Succer
}
type Fail struct{}
func (*Fail) Error() string {
return "Error"
}
type Succ struct{}
func (*Succ) Success() string {
return "Success"
}
type Combi struct{}
func (*Combi) Error() string {
return "Error"
}
func (*Combi) Success() string {
return "Success"
}
func main() {
var r Result
var s Succer
c := &Combi{}
r = c
s = c
fmt.Println(r.Error())
fmt.Println(s)
}
Как выход я получил
Error
Error
Почему? Я ожидаю как выходную ошибку и успех, потому что s
это интерфейс типа Succer, в качестве строки нет возврата ошибки. И когда я изменяю основную функцию:
func main() {
var r Result
var s Succer
c := &Combi{}
r = c
s = c
}
компилятор жалуется
# command-line-arguments
.\sample1.go:42: r declared and not used
.\sample1.go:43: s declared and not used
Почему? Я назначаю переменные r
и s
ссылку.