为了账号安全,请及时绑定邮箱和手机立即绑定

Go 接口继承

Go 接口继承

Go
月关宝盒 2022-08-24 17:04:13
我是Go的新手,不明白一件事。让我们看一个有效的代码:package mainimport "fmt"type User struct {    Name  string    Email string}type Admin struct {    User    Level string}type Notifier interface {    notify()}func (u *User) notify() {    fmt.Println("Notified", u.Name)}func SendNotification(notify Notifier) {    notify.notify()}func main() {    admin := Admin{        User: User{            Name:  "john smith",            Email: "john@email.com",        },        Level: "super",    }    SendNotification(&admin)    admin.User.notify()    admin.notify()}此处的函数 SendNotification 将 admin 结构识别为通告程序,因为 admin struct 可以访问通过指针接收器实现接口的嵌入式用户结构。还行。为什么下面的代码不起作用。为什么norgateMathError需要实现接口而不使用错误错误的实现(对我来说是同样的情况):package mainimport (    "fmt"    "log")type norgateMathError struct {    lat  string    long string    err  error}// func (n norgateMathError) Error() string {//  return fmt.Sprintf("a norgate math error occured: %v %v %v", n.lat, n.long, n.err)// }func main() {    _, err := sqrt(-10.23)    if err != nil {        log.Println(err)    }}func sqrt(f float64) (float64, error) {    if f < 0 {        nme := fmt.Errorf("norgate math redux: square root of negative number: %v", f)        return 0, &norgateMathError{"50.2289 N", "99.4656 W", nme}    }    return 42, nil}.\custom_error.go:28:13: cannot use &norgateMathError{...} (type *norgateMathError) as type error in return argument:        *norgateMathError does not implement error (missing Error method)
查看完整描述

1 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

在第一种情况下,嵌入在 里面,因此可以获得对类型上定义的所有方法的访问。UserAdminAdminUser

在第二种情况下,具有类型字段,因此不会自动访问其方法。norgateMathErrorerrError

如果你想有一个方法,你必须手动定义它norgateMathErrorError()

func (n norgateMathError) Error() string {
  return n.err.Error()
}

嵌入字段和仅包含字段之间是有区别的。更多信息可以在参考资料中找到


查看完整回答
反对 回复 2022-08-24
  • 1 回答
  • 0 关注
  • 77 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信