猿问

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

此代码有一些对象代表用户和创建该用户的管理员。它是申请人提交给我们的一些代码的精简版。当您尝试删除用户时,代码已损坏并删除管理员(如 所示main)。为什么u.Delete叫admin的delete而不是user的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


慕容3067478
浏览 170回答 2
2回答

繁华开满天机

在您的示例代码中e,UserDelete方法中的字母e与 AdminDelete方法中的字母编码不同。由于 Go 支持 utf8,这不是错误,而是一种不同的方法。修复ein User 的Delete方法,一切都应该按预期工作。

狐的传说

因为用户的 delete 方法是为 *User 而不是 for 定义的User,而 Admin 的 Delete 是为非指针定义的Admin。用户嵌入了 Admin,因此它继承了func (Admin) Delete()方法。尝试使用指向用户的指针(注意&)func main() {    u := &user.User{&admin.Admin{}}    u.Delete()}
随时随地看视频慕课网APP

相关分类

Go
我要回答