Por que existe um "novo" no Go?


49

Ainda estou intrigado com o motivo pelo qual temos newem Go.

Quando você deseja instanciar uma estrutura, você faz

t := Thing{}

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

t := &Thing{}

Mas há também essa possibilidade:

t := new(Thing)

Este último parece um pouco estranho para o resto da linguagem. &Thing{}é tão claro e conciso new(Thing)e usa apenas construções que você costuma usar em outros lugares. 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 complementar 1 é cara, torna o idioma mais complexo e contribui para o que você deve saber. E isso pode mascarar para os novatos o que está por trás de instanciar uma estrutura.

Também cria mais uma palavra reservada.

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


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


3
"... codificadores Go to ..." - esse é o motivo. F # / Haskell / etc. são muito estranhos aos desenvolvedores C e é por isso que eles estão recebendo ~ 0 tração. Scala fez um esforço e agora é mais acessível e ouvido.
Den

12
Pela mesma noção, Python e Ruby são muito estranhos aos desenvolvedores de C, pois usam várias palavras-chave desconhecidas, regras sintáticas "estranhas" (onde estão aparelhos?) E conceitos semânticos estranhos (geradores? Metaclasses? Decoradores?). No entanto, eles não têm tração ~ 0, muito pelo contrário.
Xion

8
@Xion: você olhou para a taxa de crescimento inicial do Ruby? Demorou séculos para chegar onde está agora (18 anos, para ser mais preciso). Python é ainda mais antigo (1991!).
Joachim Sauer

2
@AndresF. Parte da resistência a Scala não poderia ter nada a ver com o idioma. Como programador mais jovem (25 anos), algo sobre o próprio nome me faz pensar em um cruzamento entre uma linguagem baseada em matemática como o Matlab (do qual tenho más lembranças) e uma muito antiga como o Fortran. Nunca houve qualquer necessidade de olhar para ele.
precisa saber é

4
Uma observação: novo não é uma palavra-chave no Go. É uma função embutida.
Manish Malik

Respostas:


44

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

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

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

Então, qual é o raciocínio por trás do novo? É algo útil? Devemos usá-lo?

Você não pode fazer isso sem novas

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

new não é um recurso principal do Go, você não o encontrará usado com frequência, mas quando precisar, ele estará lá.

Felicidades

Dave

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

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

Pedi esclarecimentos adicionais:

Então, basicamente, o argumento de Dave realmente não se sustenta?

Há lugares em que é inconveniente ocultar uma nova variável apenas para obter seu endereço.

new (T) tem um significado imediatamente direto, em vez de ser um idioma de várias etapas.

O argumento de Dave só cai se a mera possibilidade técnica (de newficar sem ) for convincente por si só.

Isso não foi discutido porque era óbvio que o Go deveria tê-lo porque quase todo idioma o possui?

O "devemos guardar new?" a discussão aparece de tempos em tempos. Como não podemos retirá-lo até a segunda etapa, se eu entendi a Promessa corretamente, não parece haver muito a se fazer em torno da volta novamente; quando o Go 2 for pensável, podemos ter algumas idéias melhores e diferentes ...

Chris

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

você precisa considerar a história do projeto. Eu acho que o novo é introduzido primeiro antes que haja marca.

Isso é verdade. Na verdade, lutamos um pouco antes de ter a idéia de fazer. Se você observar os logs do repositório, poderá ver que a composição é exibida apenas em janeiro de 2009, revisão 9a924177598f.

A nova função incorporada também precedeu a idéia de & {} aceitar o endereço de um literal composto (e essa sintaxe está, em certo sentido, errada; provavelmente deveria ser (* T) {campos de T}, mas não havia o suficiente razão para mudar).

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

Ian


Eu ficaria feliz em ver links para o outro "devemos manter novos?" discussões que surgem de tempos em tempos .
Denys Séguret

Alguma coisa impede você de fazer v := &(0)e pular a variável temp? (Eu sei que no Go.)
Alex Feinman

3
@AlexFeinman Como 0é uma constante literal, você não pode usar o endereço. Um problema ocorreria se você também desejasse um tipo específico. É por isso que uma sintaxe gosta &intou &int(0)pode ser útil (embora não tenha pensado muito na melhor sintaxe). Mas fazê-lo em duas linhas, como Collins mostrou, também está bem ( vv := 0; v := &vv).
Denys Séguret

14
"Como não podemos retirá-lo até o Go 2" ... o que, como todos sabem, nunca acontecerá porque Go 2é considerado prejudicial.
Mason Wheeler

2
@MasonWheeler você quase me matou ... ainda rindo de "Go 2 considerado prejudicial" ... estranhamente, eu estava falando sobre esse artigo hoje no almoço.
Daniela Petruzalek 06/06
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.