Security 在对象';s字段而不是对象?
这段代码有一些表示用户和创建该用户的管理员的对象。这是申请人提交给我们的一些代码的精简版本。当您尝试删除该用户时,该代码被破坏并删除管理员(如Security 在对象';s字段而不是对象?,security,unicode,go,Security,Unicode,Go,这段代码有一些表示用户和创建该用户的管理员的对象。这是申请人提交给我们的一些代码的精简版本。当您尝试删除该用户时,该代码被破坏并删除管理员(如main所示)。为什么u.Delete调用管理员的Delete而不是用户的Delete package admin import "fmt" type Admin struct {} func (Admin) Delete() { fmt.Println("deleting admin") } 包用户 进口( “fmt” “管理员” ) 键入用
main
所示)。为什么u.Delete
调用管理员的Delete而不是用户的Delete
package admin
import "fmt"
type Admin struct {}
func (Admin) Delete() {
fmt.Println("deleting admin")
}
包用户
进口(
“fmt”
“管理员”
)
键入用户结构{*admin.admin}
func(*User)D,因为用户上的方法delete是为*User而不是为用户定义的,而Admin的delete是为非指针Admin
定义的。
用户嵌入了Admin,因此它继承了func(Admin)Delete()
方法
尝试使用指向用户的指针(注意&
)
在示例代码中,用户的Delete
方法中的字母e
与管理员的Delete
方法中的字母e
的编码不同。由于Go支持utf8,这不是一个错误,而是一种不同的方法。在用户的Delete
方法中修复e
,所有操作都应按预期工作 不要试图用嵌入编写继承风格的代码。这种错误是尝试这种东西的代价。你会被咬得更频繁。这也是一样。但是即使它们不同,也可以说Admin
hasremove
和User
hasdelete
,为什么u.remove
会起作用呢?@Dog这是语言的一个特点,请阅读。如果您不希望出现这种行为,请不要匿名嵌入Admin,为其命名为User{Admin Admin}
,然后访问Admin的方法,如u.Admin.Remove()
package user
import (
"fmt"
"admin"
)
type User struct {*admin.Admin}
func (*User) Dbecause the method delete on the user is defined for *User not for User
, while Admin's Delete is defined for the non pointer Admin
.
User embeds Admin, so it inherits func (Admin) Delete()
method.
try using the pointer to user (notice the &
)
func main() {
u := &user.User{&admin.Admin{}}
u.Delete()
}