Dlaczego w Go jest „nowy”?

49

Nadal jestem zaskoczony, dlaczego mamy newGo.

Jeśli chcesz utworzyć instancję struktury, robisz to

t := Thing{}

i możesz uzyskać wskaźnik do nowej instancji, wykonując

t := &Thing{}

Ale jest też taka możliwość:

t := new(Thing)

Ten ostatni wydaje się trochę obcy dla reszty języka. &Thing{}jest tak jasny i zwięzły jak new(Thing)i wykorzystuje tylko konstrukcje, których często używasz w innym miejscu. Jest również bardziej rozszerzalny, ponieważ możesz go zmienić na &Thing{3}lub &Thing{Feets:7}.

Moim zdaniem posiadanie dodatkowego słowa kluczowego 1 jest kosztowne, czyni język bardziej złożonym i dodaje do tego, co musisz wiedzieć. I może maskować początkujących, co kryje się za tworzeniem struktury.

To także tworzy jedno zastrzeżone słowo.

Więc jakie jest uzasadnienie new? Czy to czasem jest przydatne? Czy powinniśmy tego użyć?


1 : Tak, wiem, że to nie jest słowo kluczowe na poziomie gramatycznym, możesz je ukryć , ale to nie zmienia faktu, że jest to dla rozsądnego programisty słowo zastrzeżone.

Denys Séguret
źródło
3
„... to Go coders ...” - to jest powód. F # / Haskell / itp. są bardzo obce programistom języka C i dlatego uzyskują ~ 0 przyczepności. Scala podjęła wysiłek, a teraz jest bardziej przystępny i słyszalny.
Den
12
Z tego samego powodu Python i Ruby są bardzo obcy programistom języka C, ponieważ używają wielu nieznanych słów kluczowych, „dziwnych” reguł składniowych (gdzie są nawiasy klamrowe) i dziwnych koncepcji semantycznych (generatory? Metaklasy? Dekoratorzy?). Jednak nie mają ~ 0 przyczepności, wręcz przeciwnie.
Xion
8
@Xion: czy spojrzałeś na początkową stopę wzrostu Ruby? Dotarcie tam, gdzie jest teraz, zajęło wieki (a konkretnie 18 lat). Python jest jeszcze starszy (1991!).
Joachim Sauer
2
@AndresF. Część oporu wobec Scali nie mogła mieć nic wspólnego z językiem. Jako młodszy programista (25 lat) coś w samej nazwie przypomina mi skrzyżowanie języka opartego na matematyce, takiego jak Matlab (o którym źle pamiętam), z naprawdę starym, takim jak Fortran. Nigdy nie było potrzeby, aby nawet na to spojrzeć.
Izkata
4
Uwaga dodatkowa: nowy nie jest słowem kluczowym w Go. To wbudowana funkcja.
Manish Malik,

Odpowiedzi:

44

Najlepszym sposobem, aby zapytać, są prawdopodobnie ludzie pracujący nad tym; dokładnie to, co zrobiłem !

Tl; dr: pierwotnie był tam makei &{}nadal jest funkcją do użycia w niektórych sytuacjach.

Zasadniczo oto najważniejsze cytowane części:

Więc jakie jest uzasadnienie nowego? Czy to coś przydatnego? Czy powinniśmy tego użyć?

Nie możesz tego zrobić bez nowego

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

nowa nie jest główną funkcją Go, nie znajdziesz jej często używanej, ale kiedy jej potrzebujesz, jest dostępna.

Twoje zdrowie

Dave

Po kolejnej odpowiedzi pokazującej tego rodzaju rozwiązanie:

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

Poprosiłem o dalsze wyjaśnienia:

Więc w gruncie rzeczy punkt Dave'a tak naprawdę nie ma racji?

Są miejsca, w których niewygodne jest wkradanie się do nowej zmiennej po prostu po jej adres.

new (T) ma bezpośrednie znaczenie, a nie jest idiomem złożonym z wielu kroków.

Punkt Dave'a spada tylko wtedy, gdy sama techniczna możliwość (obejście się bez new) jest sama w sobie przekonująca.

Czy nie zostało to omówione, ponieważ było po prostu oczywiste, że Go powinien to mieć, ponieważ ma go prawie każdy język?

„Czy powinniśmy zachować new?” od czasu do czasu pojawia się dyskusja. Ponieważ nie możemy tego zrobić, dopóki Go 2, jeśli dobrze zrozumiem obietnicę, wydaje się, że nie ma wiele do zrobienia po ponownym obejściu pętli; do czasu, gdy Go 2 da się wymyślić, możemy mieć inne, lepsze pomysły ...

Chris

Jest tam również głównie z powodów historycznych:

musisz wziąć pod uwagę historię projektu. myślę, że nowy jest wprowadzany jako pierwszy, zanim powstanie.

To prawda. W rzeczywistości zmagaliśmy się przez chwilę, zanim wpadliśmy na pomysł zrobienia. Jeśli spojrzysz na dzienniki repozytorium, zobaczysz, że make pojawia się tylko w styczniu 2009 roku, wersja 9a924177598f.

Nowa wbudowana funkcja poprzedza także ideę & {} przyjmowania adresu złożonego literału (i ta składnia jest w pewnym sensie niepoprawna; prawdopodobnie powinna to być (* T) {pola T}, ale nie było wystarczająco dużo powód, aby to zmienić).

Nowa funkcja nie jest absolutnie konieczna, ale wydaje się, że kod używa jej w praktyce. W tym momencie trudno się go pozbyć.

Ian

Florian Margaine
źródło
Byłbym szczęśliwy widząc linki do drugiego „czy powinniśmy pozostać nowi?” dyskusje, które pojawiają się od czasu do czasu .
Denys Séguret,
Czy coś powstrzymuje cię przed robieniem v := &(0)i pomijaniem zmiennej temp? (Nie znam Go.)
Alex Feinman
3
@AlexFeinman Ponieważ 0jest to dosłowna stała, nie możesz wziąć jej adresu. Wystąpiłby problem, gdybyś chciał również określonego typu. Dlatego składnia podobna &intlub &int(0)może być przydatna (choć nie myślałem dużo o najlepszej składni). Ale robienie tego w dwóch wierszach, jak pokazał Collins, również jest w porządku ( vv := 0; v := &vv).
Denys Séguret,
14
„Ponieważ nie możemy tego zrobić, dopóki Go 2” ... co, jak wszyscy wiedzą, nigdy się nie wydarzy, ponieważ Go 2jest uważane za szkodliwe.
Mason Wheeler,
2
@MasonWheeler prawie mnie zabiłeś ... wciąż śmiejąc się z „Go 2 uważanego za szkodliwe”… dość dziwnie mówiłem dzisiaj o tym artykule podczas lunchu.
Daniela Petruzalek