2009-11-20 7 views
11

En jour 2 du tutoriel aller il y a cet exercice:de type privé avec des champs exportés

Pourquoi peut-il être utile d'avoir un type privé avec des champs exportés?

Par exemple:

package geometry 

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

Notez que point est minuscule et donc pas exporté, alors que les champs X et Y sont en majuscules et sont ainsi. Il me semble que pour avoir accès à l'un des champs exportés, il faudrait pouvoir écrire quelque chose comme ça.

p.X 

Mais pour que cela soit possible, p aurait d'avoir une déclaration comme tel:

var p geomitry.point; 

ou

p := new(geomitry.point); 

Ceci est toutefois pas possible (afaik), puisque la déclaration de type pour point n'est pas exportée.

Répondre

20

Mais vous pourriez avoir un constructeur public, n'est-ce pas?

Donc, si vous aviez un NewGeometryPoint func défini, alors vous pourriez peut-être faire (ont pas testé contre le compilateur)

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

Oui, j'ai testé cela avec le compilateur, cela fonctionne. –

+1

Wow, j'aime ça. On dirait que j'ai trouvé ma nouvelle technique. – sdellysse

9

Un type de base abstraite?

package geometry 

type point struct { 
    X, Y int; 
} 

type Point struct { 
    point; 
    name string; 
} 

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

Lors de l'utilisation du package JSON (http://golang.org/pkg/json/). Vous devez avoir des champs exportés, pour passer un type à json.Marshal(), mais vous ne voudrez peut-être pas que ce type soit publiquement disponible pour d'autres packages externes.