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)将您的结构包装在一个函数中并导出函数名称。
TA贡献1816条经验 获得超4个赞
MustKey.m是一个未导出的字段。您正在尝试初始化该字段而不使用 pkg.MustKey{map[string]string{"Hello": "bar"}}.
您要么必须通过将字段重命名为 来导出字段M,要么必须定义一个构造函数,将其设置在包中:
func NewMustKey(m map[string]string) MustKey {
return MustKey{m:m}
}
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 方法来放置您自己的逻辑。
阅读此内容以获得更好的理解。
- 3 回答
- 0 关注
- 138 浏览
添加回答
举报
