Получение "неявного присвоения неэкспортированного поля" - PullRequest
0 голосов
/ 24 апреля 2020
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
}

При выполнении следующего я получаю ошибка как упомянуто в теме. Любая помощь будет оценена.

Ответы [ 4 ]

2 голосов
/ 24 апреля 2020

MustKey.m - неэкспортированное поле. Вы пытаетесь инициализировать это поле, не обращаясь к нему по имени с помощью pkg.MustKey{map[string]string{"Hello": "bar"}}.

. Вы должны либо экспортировать поле, переименовав его в M, либо определить функцию конструктора, которая будет устанавливать это в упаковке:

func NewMustKey(m map[string]string) MustKey {
   return MustKey{m:m}
}
1 голос
/ 24 апреля 2020

В этом коде:

type MustKey struct {
   m map[string]string
}

переменная карты находится в нижнем регистре, поэтому она не экспортируется (и только для этого пакета). В Golang для экспорта любого поля из одного pkg в другое следует использовать верхний регистр.

Два решения:

1) Объявить поля карты в верхнем регистре, например:

type MustKey struct {
   // m map[string]string
   // Upper case fields can be export to other packages
   M map[string]string 
}

2) Оберните вашу структуру в одну функцию и экспортируйте имя функции.

1 голос
/ 24 апреля 2020

Поле m в структуре MustKey является строчным. Поэтому это неэкспортированное поле и не может использоваться программой, которая импортирует пакет pkg. Неэкспортируемые поля должны обрабатываться методами или функциями, которые являются внутренними для пакета pkg. Или измените его на M, а затем используйте его извне.

Вы неявно используете m при инициализации в main.

0 голосов
/ 25 апреля 2020

В Go есть очень важное правило - как экспортировать / экспортировать любые функции / методы / поля.

  • E xport - когда имя начинается с Прописная буква (произнесите это Publi c)
  • u nexport - когда имя начинается с маленькой буквы (произнесите это Private)

Так в вашем В этом случае имя типа структуры MustKey является экспортируемым (начинается с заглавной буквы M) и может быть доступно вне определенного вами пакета pkg. Но переменная map m внутри структуры начинается с небольшого m, поэтому к нему можно получить доступ вне пакета и только для этого пакета.

Итак, у вас есть 2 решения:

  1. Либо используйте 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, чтобы поместить свои собственные логи c.

Прочитайте это для хорошего понимания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...