экспортируемые поля в неэкспортируется struct в golang



Пример:



type myType struct {
foo []float64
Name string
}


myType не экспортируется, но поле Name в нем экспортируется.



Есть ли в этом смысл это делать? Это считается плохой практикой?



У меня есть что-то вроде этого, и он прекрасно компилируется.
И я могу получить доступ к полю Name, если создам экспортированный массив myType



var MyArray []myType = {... some initialization }

fmt.Println(MyArray[0].Name) // Name is visible and it compiles!!
551   1  

1 ответ:

Вполне допустимо иметь несообщенные структуры с экспортированными полями. Если тип объявлен в другом пакете, объявление var MyArray []myType будет ошибкой компиляции.

Хотя вполне допустимо иметь экспортированную функцию с невыявленным типом возврата, обычно ее использование раздражает. Инструмент golint также дает предупреждение для таких случаев:

Экспортируемая Функ ХХХ возвращает неэкспортируется изъятия тип.tname, который может раздражать использование

В таких случаях это лучше также экспортировать тип; или если вы не хотите этого делать, то создайте экспортированный интерфейс, и экспортируемая функция должна иметь возвращаемый тип этого интерфейса, и поэтому реализующий тип может остаться незарегистрированным. Поскольку интерфейсы не могут иметь полей (только методы), это может потребовать добавления некоторых методов геттера.

Также обратите внимание, что в некоторых случаях это именно то, что вам нужно: неэкспортированная структура с экспортированными полями. Иногда вы хотите передать значение структуры кому-то другому пакет для обработки, и для того, чтобы другой пакет мог получить доступ к полям, они должны быть экспортированы (но не сам тип структуры).

Хороший пример-когда вы хотите сгенерировать ответ JSON. Вы можете создать несообщаемую структуру и иметь возможность использовать encoding/json пакет, поля должны быть экспортированы. Например:
type response struct {
    Success bool   `json:"success"`
    Message string `json:"message"`
    Data    string `json:"data"`
}

func myHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json;charset=UTF-8")
    resp := &response{
        Success: true,
        Message: "OK",
        Data:    "some data",
    }
    if err := json.NewEncoder(w).Encode(resp); err != nil {
        // Handle err
    }
}

Comments

    Ничего не найдено.