Чому в Go є "нове"?


49

Я все ще спантеличений питанням, чому ми маємо newв Go.

Коли ви хочете створити структуру, ви зробите це

t := Thing{}

і ви можете отримати вказівник на новий екземпляр, виконавши

t := &Thing{}

Але є також така можливість:

t := new(Thing)

Цей останній здається трохи чужим для решти мови. &Thing{}настільки ж чітка і лаконічна, new(Thing)і вона використовує лише конструкції, які ви часто використовуєте в інших місцях. Він також більш розширюваний, оскільки ви можете змінити його на &Thing{3}або &Thing{Feets:7}.

На мою думку, наявність додаткового ключового слова 1 є дорогим, це робить мову більш складною і додає до того, що ви повинні знати. І це може замаскувати новачків, що стоїть за створенням структури.

Це також робить ще одне застережене слово.

То які міркування за цим new? Це іноді корисно? Чи повинні ми його використовувати?


1 : Так, я знаю, що це не ключове слово на рівні граматики, ви можете відтінити його , але це не змінює факту, це для розумного розробника - зарезервоване слово.


3
"... Іти кодери ..." - це причина. F # / Haskell / тощо. дуже чужі розробникам C, і тому вони отримують ~ 0 тяги. Скала доклала зусиль, і тепер це доступніше і чуте.
День

12
За тим же поняттям, Python та Ruby дуже чужі розробникам C, оскільки вони використовують купу незнайомих ключових слів, "дивні" синтаксичні правила (де брекети?) Та дивні семантичні поняття (генератори "метакласи" декоратори?). Однак вони не отримують ~ 0 тяги, навпаки.
Xion

8
@Xion: ти подивився на початковий темп зростання Ruby? Потрібні століття, щоб дістатися там, де зараз (18 років, якщо бути точним). Пітон ще старший (1991!).
Йоахім Зауер

2
@AndresF. Деякий опір Скали не може мати нічого спільного з мовою. Як молодший програміст (25 років), щось про саме ім’я змушує мене думати про перехрес між мовою, заснованою на математиці, як Matlab (про яку я маю погані спогади) та справді старою, як Fortran. Ніколи не було жодного заклику навіть подивитися на це.
Ізката

4
Побічна примітка: нове - це не ключове слово в Go. Це вбудована функція.
Manish Malik

Відповіді:


44

Найкращий спосіб запитати - це, мабуть, люди, які працюють над цим; саме те, що я зробив !

Tl, д - р: він був спочатку там раніше makeі &{}, і вона по - , як і раніше функція для використання в деяких ситуаціях.

В основному, тут цитуються найважливіші частини:

То які міркування за новим? Це щось корисне? Чи повинні ми його використовувати?

Ви не можете зробити це без нового

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

Нове не є заголовком функції Go, ви не знайдете його часто, але коли вам це потрібно, воно є.

Ура

Дейв

Після чергової відповіді, що показує таке рішення:

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

Я попросив додаткових роз'яснень:

Таким чином, точка Дейва насправді не стоїть?

Є місця, де незручно підкрадатися до нової змінної, просто взявши її адресу.

new (T) має безпосередньо пряме значення, а не бути багатоступеневою ідіомою.

Точка Дейва падає лише в тому випадку, якщо просто технічна можливість (обійтися без new) переконлива сама по собі.

Хіба це не обговорювалося, тому що було просто очевидно, що Go має його мати, тому що майже кожна мова має його?

"Чи ми збережемо new?" час від часу спливає дискусія. Оскільки ми не можемо прийняти його до Go 2, якщо я правильно зрозумів Обіцяння, здається, що від повторного обходу петлі не було багато чого; до того часу, як Go 2 стає маломожливим, ми можемо мати кілька різних і кращих ідей ...

Кріс

Він також є здебільшого з історичних причин:

вам потрібно врахувати історію проекту. Я думаю, що нове вводиться першим до того, як є.

Це правда. Насправді ми боролися деякий час, перш ніж придумати ідею зробити. Якщо ви подивитеся на журнали сховищ, ви побачите, що відображаються лише в січні 2009 року, редакція 9a924177598f.

Нова вбудована функція також передувала ідеї & {} для отримання адреси складеного буквального (і цей синтаксис у певному сенсі неправильний; він, мабуть, повинен бути (* T) {полями T}, але цього було недостатньо причина його змінити).

Нова функція не є строго необхідною, але код, здається, використовує її на практиці. На цьому важко позбутися від цього.

Ян


Я був би радий побачити посилання на іншого "чи збережемо нове?" дискусії, які час від часу спливають .
Denys Séguret

Чи щось заважає вам робити v := &(0)та пропускати змінну temp? (Я не знаю, іду.)
Алекс Фейнман

3
@AlexFeinman Оскільки 0це буквальна константа, ви не можете прийняти її адресу. Проблема може виникнути, якщо ви також хочете певного типу. Ось чому синтаксис подобається &intабо &int(0)може бути корисним (однак, не думав багато про найкращий синтаксис). Але робити це у два рядки, як показав Коллінз, теж добре ( vv := 0; v := &vv).
Denys Séguret

14
"Оскільки ми не можемо вийняти його до" Go 2 "... ... що, як всім відомо, ніколи не станеться, тому що Go 2вважається шкідливим.
Мейсон Уілер

2
@MasonWheeler ви ледве не вбили мене ... все ще сміючись з "Перехід 2 вважається шкідливим" ... досить дивно, що я говорив про цю статтю сьогодні на обід.
Даніела Петрузалек
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.