Частный тип с экспортируемыми полями

В день 2 учебника go есть это упражнение:

Почему может быть полезно иметь закрытый тип с экспортированными полями?

Например:

package geometry

type point struct {
    X, Y int;
    name string;
}

Обратите внимание, что point является строчным и, следовательно, не экспортируется, тогда как поля X и Y имеют верхний регистр и, следовательно, являются. Мне кажется, что для того, чтобы иметь доступ к одному из экспортируемых полей, вы должны были бы написать что-то вроде.

p.X

Но для того, чтобы это было возможно, p должно было бы иметь такое объявление:

var p geomitry.point;

или

p := new(geomitry.point);

Это, однако, невозможно (afaik), поскольку объявление типа для точки не экспортируется.

Ответ 1

Но у вас может быть открытый конструктор, верно?

Итак, если у вас установлена ​​функция NewGeometryPoint func, то вы, возможно, могли бы сделать (не протестировали против компилятора)

p := NewGeometryPoint(640,480);
fmt.Println("X:",p.X, "Y:",p.Y);

Ответ 2

Абстрактный базовый тип?

package geometry

type point struct {
    X, Y int;
}

type Point struct {
    point;
    name string;
}

type Rect struct {
    P1, P2 point;
    name string;
}

Ответ 3

При использовании пакета JSON (http://golang.org/pkg/json/). Вам нужно экспортировать поля, чтобы передать тип json.Marshal(), но вы, возможно, не захотите, чтобы этот тип был общедоступным для других внешних пакетов.