Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security 在对象';s字段而不是对象?_Security_Unicode_Go - Fatal编程技术网

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
has
remove
User
has
delete
,为什么
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()
}