Mengapa ada "baru" di Go?

49

Saya masih bingung mengapa kita harus newpergi.

Ketika Anda ingin instantiate sebuah struct, Anda lakukan

t := Thing{}

dan Anda bisa mendapatkan pointer ke instance baru dengan melakukan

t := &Thing{}

Tetapi ada juga kemungkinan ini:

t := new(Thing)

Yang terakhir ini tampaknya agak asing bagi seluruh bahasa. &Thing{}sejelas dan sesingkat new(Thing)itu dan hanya menggunakan konstruksi yang sering Anda gunakan di tempat lain. Ini juga lebih dapat diperluas karena Anda dapat mengubahnya ke &Thing{3}atau &Thing{Feets:7}.

Menurut pendapat saya, memiliki kata kunci tambahan 1 mahal, itu membuat bahasa lebih kompleks dan menambah apa yang harus Anda ketahui. Dan itu mungkin menutupi untuk pendatang baru apa yang ada di balik instantiating sebuah struct.

Itu juga membuat satu kata lagi dilindungi.

Jadi apa alasan di baliknya new? Apakah terkadang bermanfaat? Haruskah kita menggunakannya?


1 : Ya, saya tahu itu bukan kata kunci di tingkat tata bahasa, Anda bisa membayangi , tetapi itu tidak mengubah fakta itu, untuk pengembang yang masuk akal, kata yang dilindungi undang-undang.

Denys Séguret
sumber
3
"... untuk Go coders ..." - inilah alasannya. F # / Haskell / etc. sangat asing bagi pengembang C dan itulah sebabnya mereka mendapatkan traksi ~ 0. Scala berusaha dan sekarang lebih mudah didekati dan didengar.
Den
12
Dengan gagasan yang sama, Python dan Ruby sangat asing bagi pengembang C, karena mereka menggunakan banyak kata kunci asing, aturan sintaksis "aneh" (di mana kawat gigi?) Dan konsep semantik aneh (generator? Metaclasses? Dekorator?). Namun mereka tidak mendapatkan ~ 0 traksi, justru sebaliknya.
Xion
8
@Xion: apakah Anda melihat tingkat pertumbuhan awal Ruby? Butuh waktu lama untuk mencapai tempatnya sekarang (18 tahun, tepatnya). Python bahkan lebih tua (1991!).
Joachim Sauer
2
@AndresF. Beberapa penolakan terhadap Scala tidak ada hubungannya dengan bahasa. Sebagai programmer yang lebih muda (usia 25), sesuatu tentang nama itu sendiri membuat saya berpikir tentang persilangan antara bahasa berbasis matematika seperti Matlab (yang saya punya kenangan buruk) dan yang benar-benar tua seperti Fortran. Tidak pernah ada dorongan untuk melihatnya.
Izkata
4
Catatan tambahan: baru bukan kata kunci di Go. Ini adalah fungsi bawaan.
Manish Malik

Jawaban:

44

Cara terbaik untuk bertanya mungkin kepada orang-orang yang mengerjakannya; persis apa yang saya lakukan !

Tl; dr: awalnya ada di sana sebelum makedan &{}, dan masih berfungsi untuk digunakan dalam beberapa situasi.

Pada dasarnya, inilah bagian terpenting yang dikutip:

Jadi apa alasan di balik yang baru? Apakah ini berguna? Haruskah kita menggunakannya?

Anda tidak dapat melakukan ini tanpa yang baru

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

baru bukan fitur utama Go, Anda tidak akan sering menggunakannya, tetapi ketika Anda membutuhkannya, itu ada.

Tepuk tangan

Dave

Setelah jawaban lain yang menunjukkan solusi semacam ini:

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

Saya meminta klarifikasi lebih lanjut:

Jadi pada dasarnya, poin Dave tidak benar-benar berlaku?

Ada tempat-tempat yang tidak nyaman untuk menyelinap ke variabel baru hanya untuk mengambil alamatnya.

baru (T) memiliki makna langsung langsung, daripada menjadi ungkapan multi-langkah.

Poin Dave hanya jatuh jika kemungkinan teknis belaka (melakukan tanpa new) adalah menarik dengan sendirinya.

Bukankah ini dibahas karena jelas bahwa Go harus memilikinya karena hampir setiap bahasa memilikinya?

"Haruskah kita simpan new?" diskusi muncul dari waktu ke waktu. Karena kita tidak bisa mengeluarkannya sampai Go 2, jika aku memahami Janji dengan benar, sepertinya tidak banyak yang bisa didapat dari berputar-putar lagi; pada saat Go 2 dapat dipikirkan, kami mungkin memiliki beberapa ide yang berbeda dan lebih baik ...

Chris

Itu juga ada sebagian besar karena alasan historis:

Anda perlu mempertimbangkan sejarah proyek. Saya pikir baru diperkenalkan dulu sebelum ada make.

Itu benar. Sebenarnya kami berjuang untuk sementara waktu sebelum muncul dengan ide make. Jika Anda melihat log repositori, Anda bisa melihat bahwa make hanya muncul di Januari 2009, revisi 9a924177598f.

Fungsi builtin baru juga mendahului gagasan & {} untuk mengambil alamat literal komposit (dan sintaksinya dalam beberapa hal salah; mungkin seharusnya (* T) {bidang T} tetapi tidak cukup alasan untuk mengubahnya).

Fungsi baru tidak sepenuhnya diperlukan tetapi kode tampaknya menggunakannya dalam praktiknya. Sulit untuk menyingkirkannya pada titik ini.

Ian

Florian Margaine
sumber
Saya akan senang melihat tautan ke yang lain " akankah kita tetap baru?" diskusi yang muncul dari waktu ke waktu .
Denys Séguret
Apakah sesuatu mencegah Anda melakukan v := &(0)dan melewatkan variabel temp? (Saya tidak tahu Go.)
Alex Feinman
3
@AlexFeinman As 0adalah konstanta literal, Anda tidak dapat mengambil alamatnya. Masalah akan terjadi jika Anda ingin jenis tertentu juga. Itu sebabnya sintaks menyukai &intatau &int(0)mungkin berguna (meskipun tidak banyak berpikir tentang sintaks terbaik). Tetapi melakukannya dalam dua baris seperti yang ditunjukkan Collins juga baik-baik saja ( vv := 0; v := &vv).
Denys Séguret
14
"Karena kita tidak bisa mengeluarkannya sampai Go 2" ... yang, seperti semua orang tahu, tidak akan pernah terjadi karena Go 2dianggap berbahaya.
Mason Wheeler
2
@MasonWheeler Anda hampir membunuh saya ... masih menertawakan "Go 2 dianggap berbahaya" ... anehnya saya berbicara tentang artikel itu hari ini saat makan siang.
Daniela Petruzalek