private type with exported fields
But you could have a public constructor, right?
So if you had a NewGeometryPoint
func defined, then you maybe could do (haven't tested against the compiler)
p := NewGeometryPoint(640,480);
fmt.Println("X:",p.X, "Y:",p.Y);
An abstract base type ?
package geometry
type point struct {
X, Y int;
}
type Point struct {
point;
name string;
}
type Rect struct {
P1, P2 point;
name string;
}
This same question is presented in this Go course as:
[...]You may even have a private type with exported fields. Exercise: when is that useful?
As presented here you can access externally an element defined as internal to a package, you just can't access it directly. In the case of the structure "point" in your example, it means you CANNOT access elements of point directly, as in
// geometry.go
package geometry
type point struct {
X, Y int
}
// main.go
package main
import (
"fmt"
"./geometry"
)
func main() {
point := geometry.point{
X: 10,
Y: 20
}
fmt.Printf("Point: %#v\n", point)
}
But you CAN use the defined point to export elements that use its exported internal elements, as in
// geometry.go
package geometry
type point struct {
X, Y int
}
//Vector ...
type Vector struct {
Start point
End point
}
// main.go
package main
import (
"fmt"
"./geometry"
)
func main() {
vector := geometry.Vector{}
vector.Start.X = 10
vector.Start.Y = 10
vector.End.X = 10
vector.End.Y = 10
fmt.Printf("Vector: %#v\n", vector)
}
Result -> Vector: geometry.Vector{Start:geometry.point{X:10, Y:10}, End:geometry.point{X:10, Y:10}}
So, in my view, this mechanism is meant to give you flexibility in declaring internal data structures.
When using the JSON package (http://golang.org/pkg/json/). You need to have exported fields, to pass a type to json.Marshal(), but you might not want to have that type publicly available to other external packages.