我有一个特定的问题,我需要一个可以采用一个或另一个结构的值的变量。我用一个具有接口值的用户字段创建一个userResp结构,但是如果我添加一个函数来返回名为Password的用户的子属性,则会返回错误。user的值将是具有Password属性的结构。
结构:
type userResp struct {
user interface{}
}
Run Code Online (Sandbox Code Playgroud)
功能
func (ur *userResp) password() string {
return ur.user.Password
}
Run Code Online (Sandbox Code Playgroud)
我得到了,ur.user.Password undefined (type interface {} is interface with no methods)但是界面user可以是带有Password字段的Admin或User结构。
任何想法如何执行此操作,我需要使用用户或admin的结构并将其返回。
我不能使用2个函数,因为两种情况下的逻辑都是相同的。我需要用户或管理员的整个结构
这里有两个问题:
您无法在空接口(interface{})上调用方法,因为空接口未定义任何方法。
您不能通过接口类型仅通过方法来引用字段。
您需要确定设置为的值user应具有的行为,并定义一个接口以反映该行为。例如,如果您需要用户能够做的唯一事情就是提供密码,则界面将是
type User interface {
Password() string
}
Run Code Online (Sandbox Code Playgroud)
您的结构将是
type userResp struct {
user User
}
Run Code Online (Sandbox Code Playgroud)
然后,您将返回如下密码:
return ur.user.Password()
Run Code Online (Sandbox Code Playgroud)
无论您要存储在user字段中的任何类型,都必须在Password其上定义方法,以便它们满足User接口