此代码有一些代表用户和创建该用户的管理员的对象。这是申请人提交给我们的一些代码的精简版本。当您尝试删除用户时,代码已损坏并删除管理员(如 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) D𝚎lete() {
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
最佳答案
因为user上的delete方法是为*User而不是User
定义的,而Admin的Delete是为非指针Admin
定义的。
用户嵌入了 Admin,因此继承了 func (Admin) Delete()
方法。
尝试使用指向用户的指针(注意&
)
func main() {
u := &user.User{&admin.Admin{}}
u.Delete()
}
关于security - 在对象的字段而不是对象上调用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25677288/