此代码包含一些表示用户的对象以及创建该用户的管理员。这是申请人提交给我们的一些代码的精简版。代码被破坏并在您尝试删除用户时删除管理员(如main
所示)。为什么u.Delete
会调用管理员的删除而不是用户的删除?
package admin
import "fmt"
type Admin struct {}
func (Admin) Delete() {
fmt.Println("deleting admin")
}
package user
import (
"fmt"
"admin"
)
type User struct {*admin.Admin}
func (*User) Dlete() {
fmt.Println("deleting user")
}
package main
import (
"admin"
"user"
)
func main() {
u := user.User{&admin.Admin{}}
u.Delete()
}
$ GOPATH=`pwd` go run a.go
deleting admin
答案 0 :(得分:2)
因为用户的方法删除是针对*用户而不是User
定义的,而Admin的删除是针对非指针Admin
定义的。
用户嵌入了Admin,因此它继承了func (Admin) Delete()
方法。
尝试使用指向用户的指针(注意&
)
func main() {
u := &user.User{&admin.Admin{}}
u.Delete()
}
答案 1 :(得分:1)
在您的示例代码中,用户e
方法中的字母Delete
与管理员{{1}中的字母e
的编码不同} 方法。由于Go支持utf8,这不是错误,但它是一种不同的方法。修复用户Delete
方法中的e
,所有方法都应按预期工作。