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

标签 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) 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/

相关文章:

python - 如何控制包含东亚字符的 Unicode 字符串的填充

go - 在go中实现redis

Java Web 应用程序通过 cookie 保护授权

php - MySQL 数据库中加密数据的通配符搜索?

c# - 可以从 "unsafe"上下文运行具有 "safe"方法的程序集吗?

go - 如何在golang终端打印时禁用键盘

无法使用带点的相对路径加载 Javascript 文件

java - 如何使用换行符加密文件

javascript - Z͎̠͗ͣḁ̵͙̑l͖͙̫̲̉̃ͦ̾͊ͬ̀g͔̤̞͓̐̓̒̽o͓̳͇̔ͥ文本如何被阻止?

mysql - spring mvc和mysql的UTF-16编码