2009-11-20 6 views
11

En el día 2 del tutorial Ir existe este ejercicio:tipo privado con campos exportados

¿Por qué puede ser útil tener un tipo privado con campos exportados?

Por ejemplo:

package geometry 

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

en cuenta que point es minúscula y por lo tanto no exportado, mientras que los campos X e Y son mayúsculas y por lo tanto son. Me parece que, para tener acceso a uno de los campos exportados, debería poder escribir algo como.

p.X 

Pero para que esto sea posible, p tendría que tener una declaración como tales:

var p geomitry.point; 

o

p := new(geomitry.point); 

Sin embargo, esto no es posible (que yo sepa), ya que la declaración de tipo para el punto no se exporta.

Respuesta

20

Pero podrías tener un constructor público, ¿verdad?

Así que si se hubiera definido un NewGeometryPoint func, entonces tal vez podría hacer (no se han probado contra el compilador)

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

Sí, probé esto con el compilador, esto funciona. –

+1

Guau, me gusta eso. Parece que encontré mi nueva técnica. – sdellysse

9

Un tipo de base abstracta?

package geometry 

type point struct { 
    X, Y int; 
} 

type Point struct { 
    point; 
    name string; 
} 

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

Al utilizar el paquete JSON (http://golang.org/pkg/json/). Debe tener campos exportados para pasar un tipo a json.Marshal(), pero es posible que no desee que ese tipo esté disponible públicamente para otros paquetes externos.

Cuestiones relacionadas