为了账号安全,请及时绑定邮箱和手机立即绑定

获取“未导出字段的隐式分配”

获取“未导出字段的隐式分配”

Go
慕容森 2022-06-01 11:31:50
package mainmain.goimport (    "fmt"    "practice/pkg")func main() {    mk := pkg.MustKey{map[string]string{"Hello": "bar"}}    fmt.Printf("%v\n", mk)}pkg 包你好.gopackage pkgtype MustKey struct {    m map[string]string}在执行以下操作时,我收到主题行中提到的错误。任何帮助将不胜感激。
查看完整描述

3 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

在这段代码中:


type MustKey struct {

   m map[string]string

}

map 变量是小写的,因此它是未导出的(并且仅对该包私有)。在 Golang 中,要将任何字段从一个 pkg 导出到另一个,我应该使用大写。


两种解决方案:


1) 以大写形式声明 Map 字段,例如:


type MustKey struct {

   // m map[string]string

   // Upper case fields can be export to other packages

   M map[string]string 

}

2)将您的结构包装在一个函数中并导出函数名称。


查看完整回答
反对 回复 2022-06-01
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

MustKey.m是一个未导出的字段。您正在尝试初始化该字段而不使用 pkg.MustKey{map[string]string{"Hello": "bar"}}.


您要么必须通过将字段重命名为 来导出字段M,要么必须定义一个构造函数,将其设置在包中:


func NewMustKey(m map[string]string) MustKey {

   return MustKey{m:m}

}


查看完整回答
反对 回复 2022-06-01
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

Go 中有一条非常重要的规则——如何导出/取消导出任何函数/方法/字段。


出口- 当名称以大写字母开头时(说它公开)

u nexport - 当名称以小写字母开头时(说它是 Private)

因此,在您的情况下,结构类型名称MustKey是可导出的(以大写字母开头M)并且可以在您定义的 package 之外访问pkg。但是结构中的 map 变量m确实以 small 开头m,因此它不能在包外部访问,并且只能对该包私有。


因此,您有 2 个解决方案:


使用M而不是m,例如:

    type MustKey struct {

        M map[string]string

    }

或者,如果您仍然希望映射变量私有 - 使用导出的方法和接口的帮助

    type MustKey struct {

        m map[string]string

    }


    func (mk *MustKey) GetValue(key string) (string, error) {

        value, ok := m[key]

        if !ok {

            return "", fmt.Errorf("Key is not available: %s", key)

        }

        return value, nil

    }


    func (mk *MustKey) SetValue(key, value string) {

        m[key] = value

    }

您可以使用这些 Get 和 Set 方法来放置您自己的逻辑。


阅读此内容以获得更好的理解。


查看完整回答
反对 回复 2022-06-01
  • 3 回答
  • 0 关注
  • 138 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号