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

Bis*_*Das 10 go

package main
Run Code Online (Sandbox Code Playgroud)

主程序

import (
    "fmt"
    "practice/pkg"
)

func main() {
    mk := pkg.MustKey{map[string]string{"Hello": "bar"}}
    fmt.Printf("%v\n", mk)
}
Run Code Online (Sandbox Code Playgroud)

包装袋

你好。

package pkg

type MustKey struct {
    m map[string]string
}
Run Code Online (Sandbox Code Playgroud)

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

Vin*_*pta 16

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

  • 导出- 当名称以大写字母开头时(说是 Public)
  • u nexport - 当名称以小写字母开头时(说是 Private)

因此,在您的情况下,结构类型名称MustKey是可导出的(以大写开头M)并且可以在您定义的 package 外部访问pkg。但是结构体内部的映射变量m确实以小开头m,因此无法在包外部访问它,并且只能对该包私有。

所以,你有 2 个解决方案:

  1. 要么使用M代替m,例如:
    type MustKey struct {
        M map[string]string
    }
Run Code Online (Sandbox Code Playgroud)
  1. 或者,如果您仍然希望地图变量私有 - 在接口的帮助下使用导出方法
    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
    }
Run Code Online (Sandbox Code Playgroud)

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

阅读本文以获得更好的理解。


小智 5

在此代码中:

type MustKey struct {
   m map[string]string
}
Run Code Online (Sandbox Code Playgroud)

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

两种解决方案:

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

type MustKey struct {
   // m map[string]string
   // Upper case fields can be export to other packages
   M map[string]string 
}
Run Code Online (Sandbox Code Playgroud)

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


vou*_*rus 2

mMustKey 结构中的字段是小写的。因此,它是一个未导出的字段,不能被导入 pkg 包的程序使用。未导出的字段必须通过 pkg 包内部的方法或函数进行操作。或者将其更改为 anM然后在外部使用。

m当您在 main 中进行初始化时,您正在隐式使用。