当前位置: 首页 > 面试题库 >

在golang中嵌入结构会产生错误“未知字段”

储嘉悦
2023-03-14
问题内容

我有一个structuser呼包account

type Account struct {
    Tp          string `json:"type"bson:"type"`
    AccountId   string  `json:"account_id"bson:"account_id"`
    Credentials map[string]interface{} `json:"credentials,omitempty"bson:"credentials,omitempty"`
    ProfilePicture string `json:"profile_picture,omitempty"`
    Username string `json:"username"bson:"username"`
    AccessToken map[string]interface{}`bson:"access_token,omitempty"`
}

并在user/accounts即时通讯中尝试将此帐户结构嵌入到另一个结构中

type returnAccount struct {
    user.Account
    AccessToken string `json:"access_token,omitempty"`
}

用户包已正确导入,然后尝试嵌入,我已成功使用它

最终,我正在获取用户帐户并制作returnAccount功能图并从中返回,这是我的功能

func getAccounts(usr *user.AuthenticatedUser, id ...string) (accounts map[string]returnAccount) {
    accounts = make(map[string]returnAccount)
    if len(id) > 0 {
        for _, v := range id {
            for _, acnt := range usr.Accounts {
                if acnt.AccountId == v {
                    accounts[acnt.AccountId] = returnAccount{
                        Tp:       acnt.Tp,
                        AccountId:acnt.AccountId,
                    }
                }
            }
        }
        return
    }
    for _, v := range usr.Accounts {
        accounts[v.AccountId] = returnAccount{
            Tp:       v.Tp,
            AccountId:v.AccountId,
            Username: v.Username,

        }

    }
    return
}

但是此代码不会在这里编译是错误消息

# sgin/api/user/accounts
api/user/accounts/getaccounts.go:16: unknown returnAccount field 'Tp' in struct literal
api/user/accounts/getaccounts.go:17: unknown returnAccount field 'AccountId' in struct literal
api/user/accounts/getaccounts.go:26: unknown returnAccount field 'Tp' in struct literal
api/user/accounts/getaccounts.go:27: unknown returnAccount field 'AccountId' in struct literal
api/user/accounts/getaccounts.go:28: unknown returnAccount field 'Username' in struct literal

一切似乎都非常简单明了,我无法弄清楚为什么会出现此错误,并且我需要达到Account结构的所有成员都已导出

我需要此字段的原因是我想通过api发送访问令牌给客户端,而不是秘密,并且我想减少缩进级别


问题答案:

您正在尝试初始化提升字段,这是复合文字无法实现的。从Go
spec中

如果 xf 是表示该字段或方法f的合法选择器,则将结构x中匿名字段的字段或方法f称为提升。

提升的字段的作用类似于结构的普通字段,只是它们不能用作结构的复合文字中的字段名称。

但是您可以使用点符号来访问它们:

ra:= returnAccount{}
ra.Tp = acnt.Tp


 类似资料:
  • 问题内容: 是否可以在不使用嵌入式结构的情况下继承类型的方法? 代码的第一个片段是将结构嵌入其中的工作代码,我可以在上调用该方法。我不喜欢的是,当我初始化时,我有(?)来初始化其中的结构。有没有解决的办法? 最终,我想做以下事情。where 是类型和初始化位置,也不需要初始化结构。以下代码不起作用,但可能清楚我的目标是什么。 我将添加更多使用的方法的结构,这就是我要问的原因。如果只拥有,我将拥有可

  • 问题内容: 我正在尝试运行以下代码: 但我得到这个错误: 问题答案: 要初始化嵌入式sql.NullInt64,您必须编写: 或者,如果您的NullInt64结构包含不想显式初始化的其他字段,则可以使用其类型访问嵌入的字段:

  • 问题内容: 假设,我运行一个API,并且当用户在用户资源上发出GET请求时,我将以JSON的形式返回相关字段 如您所见,User中的Secret字段具有。这意味着在大多数操作中,我都不想返回。在这种情况下,响应将是 忽略该字段将不会返回该字段机密。 现在,我将打开一个我想返回秘密字段的管理员专用路由。但是,这将意味着复制User结构。 我当前的解决方案如下所示: 有没有一种方法可以将User嵌入a

  • 问题内容: 我有以下几种类型: 我可以使用use ,但是我 不能 使用 似乎可以嵌入语法,但是使用它无效吗? 问题答案: 嵌入式类型是(未命名的)字段,由不合格的类型名称引用。 规格:结构类型: 使用类型但没有显式字段名称声明的字段是 匿名字段 ,也称为 嵌入式 字段或该类型在结构中的嵌入。必须将嵌入式类型指定为类型名称或指向非接口类型名称的指针,并且本身不能为指针类型。 非限定类型名称充当字段名

  • 我试图按照https://docs.angularjs.org/tutorial的教程操作,但在运行该命令时出错 Angulal-PhoneCat@0.0.0 postinstall c:\git\Angulal-paractions\Angulal-PhoneCat bower install Angulal-PhoneCat@0.0.0update-webdriver C:\git\Angul

  • 问题内容: 我知道如何在同一包中的结构中嵌入其他结构,但是如何在其他包的结构中嵌入结构? dog.go main.go 当我运行main.go时,它告诉我一个错误: 问题答案: @simon_xia是正确的,看来您 可能 对Go有点陌生。 首先,欢迎来到社区!! 现在,请扩展一下他的评论… Go并未提供成员/方法的公共/私有范围,而是具有Exporting的概念。因此,如果要允许从另一个包访问方法