¿Por qué hay un "nuevo" en Go?

41

Todavía estoy desconcertado por el motivo por el que tenemos new en Go.

Cuando quieras crear una instancia de una estructura, lo haces

t := Thing{}

y puede obtener un puntero a una nueva instancia haciendo

t := &Thing{}

Pero también existe esta posibilidad:

t := new(Thing)

Este último me parece un poco extraño. &Thing{} es tan claro y conciso como new(Thing) y usa solo las construcciones que usas a menudo en otros lugares. También es más extensible, ya que podría cambiarlo a &Thing{3} o &Thing{Feets:7} .

En mi opinión, tener una palabra clave complementaria 1 es costoso, hace que el lenguaje sea más complejo y se suma a lo que debe saber. Y podría enmascarar a los recién llegados lo que hay detrás de la creación de instancias de una estructura.

También hace una palabra más reservada.

Entonces, ¿cuál es el razonamiento detrás de new ? ¿Es a veces útil? ¿Debemos usarlo?

1 : Sí, sé que no es una palabra clave a nivel gramatical, puede Cúbralo , pero eso no cambia el hecho de que es, para el desarrollador razonable, una palabra reservada.

    
pregunta Denys Séguret 04.09.2013 - 09:31

3 respuestas

36

La mejor manera de preguntar es probablemente a las personas que trabajan en ello; exactamente lo que hice !

Tl; dr: originalmente estaba allí antes de make y &{} , y aún es la función que se usa en algunas situaciones.

Básicamente, aquí están las partes más importantes citadas:

  
    

Entonces, ¿cuál es el razonamiento detrás de nuevo? ¿Es algo útil? Deberíamos     usalo?

  
     

No puedes hacer esto sin nuevo

v := new(int)
*v++
fmt.Println(*v)
  

la nueva no es una característica principal de Go, no la encontrarás con frecuencia, pero   Cuando lo necesitas, está ahí.

     

Saludos

     

Dave

Después de otra respuesta que muestra este tipo de solución:

vv := 0
v := &vv
*v++
fmt.Println(*v)

Pedí más aclaraciones:

  
    

Básicamente, ¿el punto de Dave no se sostiene?

  
     

Hay lugares donde es inconveniente meterse en un nuevo   Variable solo para tomar su direccion.

     

nuevo (T) tiene un significado inmediatamente directo, en lugar de   ser un lenguaje de varios pasos.

     

El punto de Dave solo cae si se trata de una mera posibilidad técnica (de prescindir de    new ) es convincente por sí mismo.

     
    

¿No se discutió esto porque era obvio que Go debería tenerlo porque casi todos los idiomas lo tienen?

  
     

El "deberíamos mantener new ?" la discusión aparece de vez en cuando.   Ya que no podemos eliminarlo hasta Go 2, si entiendo la Promesa correctamente,   Parece que no hay mucho que se pueda tener al dar la vuelta al   bucle de nuevo para el momento en que Go 2 se pueda pensar, podríamos tener algunos   Ideas diferentes y mejores ...

     

Chris

También está allí principalmente por razones históricas:

  
    

necesitas considerar la historia del proyecto. creo que se introduce nuevo     Primero antes de que haya make.

  
     

Eso es cierto. De hecho, luchamos por un tiempo antes de llegar a   La idea de hacer. Si miras los registros del repositorio puedes ver que   make solo aparece en enero de 2009, revisión 9a924177598f.

     

La nueva función incorporada también precedió a la idea de & {} para tomar el   dirección de un literal compuesto (y esa sintaxis es en cierto sentido   incorrecto; probablemente debería ser (* T) {campos de T} pero no había   razón suficiente para cambiarlo).

     

La nueva función no es estrictamente necesaria pero el código parece usar   En la práctica. Es difícil deshacerse de él en este momento.

     

Ian

    
respondido por el Florian Margaine 05.11.2013 - 15:02
-1

Diga si tiene que definir un tipo basado en el tipo primitivo existente int.

type MyInt int

Ahora quieres crear una instancia a partir de eso. ie) Puntero a esa variable:

La única forma de hacerlo es:

x := new(MyInt)
*x = 7
    
respondido por el subram 28.09.2016 - 17:31
-2

Probablemente esté allí principalmente para facilitar la lectura.

La legibilidad a menudo se traduce en capacidad de escritura, y generalmente hace que un lenguaje sea más rápido de aprender. Para los programadores de Python, es genial que Python permita declaraciones como esta:

if flag is not None:

Es solo una palabra gramatical de inglés perfecto; mientras que, como nunca había programado en Go antes, no tendría conjeturas qué significa &Thing{} .

Dicho esto, no hay una "manera correcta" de programar un lenguaje, y, por supuesto, una sala llena de programadores Go bien informados podría terminar su proyecto en menos tiempo que los programadores de Python que utilizan tales trucos con información privilegiada; Sé que este es a menudo el caso para mí con el código Javascript (un idioma con el que estoy completamente familiarizado, pero tengo que aceptar que a menudo tiene poco o ningún sentido).

    
respondido por el Katana314 04.09.2013 - 15:51

Lea otras preguntas en las etiquetas