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

package main

main.go


import (

    "fmt"

    "practice/pkg"

)


func main() {

    mk := pkg.MustKey{map[string]string{"Hello": "bar"}}

    fmt.Printf("%v\n", mk)

}

pkg 包


你好.go


package pkg


type MustKey struct {

    m map[string]string

}

在执行以下操作时,我收到主题行中提到的错误。任何帮助将不胜感激。


慕容森
浏览 139回答 3
3回答

千万里不及你

在这段代码中: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)将您的结构包装在一个函数中并导出函数名称。

繁华开满天机

MustKey.m是一个未导出的字段。您正在尝试初始化该字段而不使用 pkg.MustKey{map[string]string{"Hello": "bar"}}.您要么必须通过将字段重命名为 来导出字段M,要么必须定义一个构造函数,将其设置在包中:func NewMustKey(m map[string]string) MustKey {   return MustKey{m:m}}

元芳怎么了

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 方法来放置您自己的逻辑。阅读此内容以获得更好的理解。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go