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 中有一条非常重要的规则 - 如何导出/取消导出任何函数/方法/字段。
因此,在您的情况下,结构类型名称MustKey是可导出的(以大写开头M)并且可以在您定义的 package 外部访问pkg。但是结构体内部的映射变量m确实以小开头m,因此无法在包外部访问它,并且只能对该包私有。
所以,你有 2 个解决方案:
M代替m,例如: type MustKey struct {
M map[string]string
}
Run Code Online (Sandbox Code Playgroud)
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) 将您的结构包装在一个函数中并导出函数名称。
mMustKey 结构中的字段是小写的。因此,它是一个未导出的字段,不能被导入 pkg 包的程序使用。未导出的字段必须通过 pkg 包内部的方法或函数进行操作。或者将其更改为 anM然后在外部使用。
m当您在 main 中进行初始化时,您正在隐式使用。