2009-11-20 8 views
11

In Tag 2 von unterwegs Tutorial gibt es diese Übung:privater Typ mit exportierten Feldern

Warum kann es sinnvoll sein, mit exportierten Feldern eine private Art zu haben?

Zum Beispiel:

package geometry 

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

Beachten Sie, dass point Klein ist und somit nicht ausgeführt, während die Felder X und Y in Großbuchstaben sind, und somit sind. Es scheint mir, dass man, um Zugang zu einem der exportierten Felder zu haben, etwas schreiben können müsste.

p.X 

Aber damit das möglich sein würde p eine Erklärung wie solche haben müssen:

var p geomitry.point; 

oder

p := new(geomitry.point); 

Dies ist jedoch nicht möglich ist (afaik), da die Typdeklaration für den Punkt nicht exportiert wird.

Antwort

20

Aber Sie könnten einen öffentlichen Konstruktor haben, richtig?

Wenn Sie also ein NewGeometryPoint func definiert hatte, dann vielleicht könnten Sie tun (nicht gegen den Compiler getestet)

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

Ja, ich habe das mit dem Compiler getestet, das funktioniert. –

+1

Wow, das mag ich. Es sieht so aus, als hätte ich meine neue Technik gefunden. – sdellysse

9

Eine abstrakte Basistyp?

package geometry 

type point struct { 
    X, Y int; 
} 

type Point struct { 
    point; 
    name string; 
} 

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

Bei Verwendung des JSON-Pakets (http://golang.org/pkg/json/). Sie müssen Felder exportiert haben, um einen Typ an json.Marshal() zu übergeben, aber Sie möchten diesen Typ möglicherweise nicht für andere externe Pakete verfügbar machen.