экспортируемые поля в неэкспортируется 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!!
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