2011-06-21 15 views
13

tratando de tener un tipo Char que es un string de un carácter de largo. lo que no puedo hacer es crear un "constructor". Sé que me estoy perdiendo algo completamente obvio.En Go, ¿cómo creo un "constructor" para un tipo con un tipo base de cadena?

declarar el tipo Char

 
    type Char string 

puede utilizar ese tipo con una declaración

 
    var c1 Char("abc") 
    var c2 Char = "abc" 

éstos están equivocados: c1 y c2 necesidad de ser "una" y no "abc"

Lo que realmente quiero es un "constructor" para limitar Char a un personaje

 
func Char(s string) Char { 
    var ch string = s[0] 
    return ch 
} 

, por supuesto, tener la type Char y func Char no es la manera de hacerlo

 
type.go:8: Char redeclared in this block 

¿hay alguna manera de forzar type inicialización a través de un constructor? o incluso estoy haciendo la pregunta correcta?

permítanme decir de otra manera: si el usuario dice var c Char = "abc" tendrán un valor no válido para el tipo Char - ¿Hay alguna manera de forzar al usuario a func NewChar(string) Char como Char 's único constructor válida?

+0

Es el lenguaje de programación Go, no golang. – peterSO

+8

perdón por el golang - pensé que estaba viendo eso como una referencia estándar. la diferencia entre las goggles para "go" vs "golang" es enorme, por lo que siempre hemos intentado poner la frase "golang" como cortesía, pero abierto a las sugerencias –

+0

Si quieres forzar al constructor, debes poner tu código en un archivo separado paquete, exponer interfaz pública y un constructor que devolverá una estructura privada que implementa la interfaz. –

Respuesta

8

Este es el paquete char.Tenga en cuenta el campo CharCharstruct no c.

package char 

type Char struct { 
    c rune 
} 

func New(c rune) *Char { 
    return &Char{c} 
} 

func (c *Char) Char() rune { 
    return c.c 
} 

func (c *Char) String() string { 
    return string(c.c) 
} 

Aquí hay un ejemplo de cómo utilizar el paquete char.

package main 

import (
    "char" 
    "fmt" 
) 

func main() { 
    var c = char.New('z') 
    var d = c.Char() 
    hello := "Hello, world; or สวัสดีชาวโลก" 
    h := []rune(hello) 
    ก := char.New(h[len(h)-1]) 
    fmt.Println(c, "a-"+c.String(), '0' <= d && d <= '9', ก) 
} 

Salida:

z a-z false ก 
+0

@mattn: hecho. gracias – peterSO

+0

tiene perfecto sentido (de nuevo). con tantos idiomas y paradigmas conflictivos, a veces es difícil entrar en la zona correcta. todavía estoy tratando de concentrar mi mente en todas las interfaces. genial, pero necesita una mejor comprensión cuántica antes de que se vuelva orgánica. –

+0

Aparece un error con este código: "no puedo convertir hello (escribir cadena) para escribir [] int" – RoboTamer

2

En la primera, consulte el siguiente ejemplo.

package main 

func main() { 
    s := "hello 世界" 
    //for getting characters from string 

    cells := []int(s) 
    for _, c := range cells { 
     println(c, string(c)) 
     // You'll get 
     // 104 h 
     // 101 e 
     // 108 l 
     // 108 l 
     // 111 o 
     // 32 
     // 19990 世 
     // 30028 界 
    } 

    bytes := []byte(s) 
    for _, b := range bytes { 
     println(b, string(b)) 
     // 104 
     // 101 
     // 108 
     // 108 
     // 111 
     // 32 
     // 228 
     // 184 
     // 150 
     // 231 
     // 149 
     // 140 
    } 
} 

El significado de [] int (s) es "emitir a caracteres unicode". El significado de [] byte (s) es "convertir a bytes".

Y, Go no tiene constructor. En el estilo de Go, el paquete proporciona la función NewXXX() para el objeto XXX.

type Client struct { 
    // ... 
} 

func NewClient() *Client { 
    return &Client{/* ... */} 
} 

ACTUALIZACIÓN:

Si se refiere a Char como "1 elemento de la cadena", debe definir de la siguiente manera.

type Char int 

O

type Char byte 

Su definición

type Char string 

se vuelve a definir de "cadena". Entonces puede almacenar cadena.

+0

no creo que esté siendo muy claro. en 'type Char string',' string' es el tipo de línea, entonces uno puede decir 'var c Char =" abc "'. entonces 'c ==" abc "' pero eso está mal - necesita 'c ==" a "'. Supongo que lo que me pregunto es si es posible interceptar y/o desactivar la interpretación inicial de Go de 'var c Char =" abc "' === 'c: = Char (" abc ")', o si hay otros más enfoques sensatos a este problema. –

+0

gracias por el estilo 'func NewType() Type' Go para un constructor –

+0

se perdió su intento original - gracias. esto es para una interfaz db, así que (creo) 'char' podría basarse en la codificación del cliente, un desagradable problema que ignoro cobardemente por el momento. pero creo que tienes más razón que yo y moverá 'Char' a' uint', así que gracias por eso. ¿Tiene alguna idea sobre la pregunta original sobre cómo evitar que el compilador construya tipos por sí mismo y no pase por el constructor? –

0

un carácter Unicode sola en Go está representado por un uint32 Se podría hacer lo siguiente:

type Char uint32 
var a Char = 'a' 

No hay necesidad de un constructor, ya que sólo se puede utilizar el carácter literal.

+0

debería haberlo visto venir. digamos que queremos un 'tipo Char2 cadena' donde tendrá exactamente dos caracteres, entonces ¿cómo resolver el problema - o puede ser resuelto? Por cierto, 'string' para la cordura del usuario, ya que en la práctica un db' char' se usa principalmente como una cadena. –

0

Junto con las otras respuestas, debe tenerse en cuenta que Go no tiene tal cosa como una sintaxis especial constructor. Sin embargo, hay algunas convenciones. En general, cuando tiene un tipo personalizado y necesita un constructor, escribe una función NewT() que toma los parámetros que necesita, realiza la inicialización y devuelve una instancia de dicho tipo.

type Char string 

func NewChar(s string) Char { 
    if len(s) == 0 { 
     return Char("") 
    } 
    return Char(s[:1]) 
} 
+0

Si un paquete t implementa tipo T y solo hay un constructor, la convención es nombrarlo Nuevo para que se lee fácilmente como t.Nuevo. Por ejemplo: http://golang.org/search?q=New. – peterSO

Cuestiones relacionadas