Go接口属性未定义

时间:2019-05-13 23:03:52

标签: go struct

我有一个特定的问题,我需要一个可以采用一个或另一个结构的值的变量。我用一个具有接口值的用户字段创建一个userResp结构,但是如果我添加一个函数来返回名为Password的用户的子属性,则会返回错误。用户的值将是具有密码属性的结构。

结构:

type userResp struct {
  user interface{}
}

功能

func (ur *userResp) password() string {
  return ur.user.Password
}

我得到ur.user.Password undefined (type interface {} is interface with no methods),但是界面user可以是具有Password字段的Admin或User结构。

任何想法,我需要使用用户或admin的结构并将其返回。

我不能使用2个函数,因为两种情况下的逻辑是相同的。我需要User或Admin的整个结构

1 个答案:

答案 0 :(得分:5)

这里有两个问题:

您不能在空接口(interface{})上调用方法,因为空接口没有定义方法。

您不能通过接口类型仅通过方法来引用字段。

您需要确定设置为user的值应具有的行为,并定义一个反映该行为的接口。例如,如果您需要用户唯一能够做的就是提供密码,那么界面应该是

type User interface {
    Password() string
}

您的结构将是

type userResp struct {
  user User
}

然后您将返回如下密码:

return ur.user.Password()

无论您想存储在user字段中的任何类型,都必须在其上定义Password方法,以便它们满足User接口