Por que há um “novo” no Go?

42

Ainda estou intrigado porque temos new em Go.

Quando você quer instanciar uma estrutura, você faz

t := Thing{}

e você pode obter um ponteiro para uma nova instância, fazendo

t := &Thing{}

Mas também há essa possibilidade:

t := new(Thing)

Este último parece um pouco estranho para mim. &Thing{} é tão claro e conciso quanto new(Thing) e usa apenas construções que você costuma usar em outro lugar. Também é mais extensível, pois você pode alterá-lo para &Thing{3} ou &Thing{Feets:7} .

Na minha opinião, ter uma palavra-chave suplementar 1 custosa torna a linguagem mais complexa e contribui para o que você precisa saber. E isso pode mascarar para os recém-chegados o que está por trás da instanciação de uma estrutura.

Também faz mais uma palavra reservada.

Então, qual é o raciocínio por trás de new ? Às vezes é útil? Devemos usá-lo?

1 : Sim, eu sei que não é uma palavra-chave no nível gramatical, você pode faça sombra , mas isso não muda o fato de que, para o desenvolvedor razoável, uma palavra reservada.

    
por Denys Séguret 04.09.2013 / 09:31
fonte

3 respostas

36

A melhor maneira de perguntar é provavelmente para as pessoas que trabalham nela; exatamente o que eu fiz !

Tl; dr: originalmente estava lá antes de make e &{} , e ainda é a função a ser usada em algumas situações.

Basicamente, aqui estão as partes mais importantes citadas:

So what's the reasoning behind new ? Is it something useful ? Should we use it ?

     

Você não pode fazer isso sem novo

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

new isn't a headline feature of Go, you won't find it used often, but when you need it, it is there.

Cheers

Dave

Depois de outra resposta mostrando esse tipo de solução:

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

Pedi mais esclarecimentos:

So basically, Dave's point doesn't really stand?

     

Existem lugares onde é inconveniente esgueirar-se em um novo   variável apenas para ter seu endereço.

     

novo (T) tem um significado imediatamente direto, em vez de   sendo um idioma multi-passo.

     

O ponto de Dave só cai se a mera possibilidade técnica (de se fazer sem    new ) é atraente por si só.

     

Wasn't this discussed because it was just obvious that Go should have it because almost every language has it?

     

O "devemos manter new ?" a discussão aparece de vez em quando.   Desde que não podemos tirá-lo até Go 2, se eu entendi a promessa corretamente,   Parece que não há muito a ser tido em volta do   loop novamente; no momento em que o Go 2 for thinkaboutable, talvez tenhamos   idéias diferentes e melhores ...

     

Chris

Também está lá principalmente por razões históricas:

you need to consider the history of the project. i think new is introduced first before there is make.

     

Isso é verdade. Na verdade, nós lutamos por um tempo antes de chegar   a ideia de fazer. Se você olhar para os logs do repositório você pode ver que   make only aparece em janeiro de 2009, revisão 9a924177598f.

     

A nova função interna também precedeu a ideia de & {} para tomar o   endereço de um literal composto (e essa sintaxe é de alguma forma   errado; provavelmente deveria ser (* T) {campos de T} mas não havia   razão suficiente para alterá-lo).

     

A nova função não é estritamente necessária, mas o código parece usar   na prática. É difícil se livrar disso neste momento.

     

Ian

    
por 05.11.2013 / 15:02
fonte
-1

Digamos que você tenha que definir um tipo com base no tipo primitivo existente int.

type MyInt int

Agora você deseja criar uma instância a partir disso. ie) Ponteiro para essa variável:

A única maneira de fazer isso é:

x := new(MyInt)
*x = 7
    
por 28.09.2016 / 17:31
fonte
-2

Provavelmente está principalmente lá para legibilidade.

A legibilidade geralmente se traduz em capacidade de escrita, e geralmente torna a linguagem mais rápida de ser captada. Para programadores de Python, é ótimo que o Python permita instruções como esta:

if flag is not None:

É apenas uma palavra gramatical do inglês perfeito; Considerando que, nunca tendo programado em Go antes, eu não teria como adivinhar o que significa &Thing{} .

Dito isso, não há um "caminho certo" para programar um idioma e, é claro, uma sala cheia de programadores Go bem-informados poderia realizar seu projeto em menos tempo que os codificadores Python usando esses truques internos; Eu sei que este é frequentemente o caso para mim com o código Javascript (uma língua que eu estou totalmente familiarizado, mas eu tenho que concordar com frequência faz pouco ou nenhum sentido).

    
por 04.09.2013 / 15:51
fonte

Tags