gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:39:51 26 4
gpt4 key购买 nike

这段代码有一些对象代表一个用户和创建该用户的管理员。它是申请人提交给我们的一些代码的精简版。当您尝试删除用户时,代码被破坏并删除了管理员(如 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

最佳答案

因为用户的 delete 方法是为 *User 而不是 User 定义的,而 Admin 的 Delete 是为非指针 Admin 定义的。User嵌入了Admin,所以继承了func (Admin) Delete()方法。

尝试使用指向用户的指针(注意 &)

func main() {
u := &user.User{&admin.Admin{}}
u.Delete()
}

关于security - 在对象的字段而不是对象上调用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25677288/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com