在对象的字段而不是对象上调用的方法?

时间:2014-09-05 01:13:06

标签: security unicode go

此代码包含一些表示用户的对象以及创建该用户的管理员。这是申请人提交给我们的一些代码的精简版。代码被破坏并在您尝试删除用户时删除管理员(如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

2 个答案:

答案 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,所有方法都应按预期工作。