Go'da neden “yeni” var?


49

Hala neden newGo'da olduğumuz konusunda şaşkınlığım var

Bir yapıyı başlatmak istediğinizde,

t := Thing{}

ve yaparak yeni bir örneğe işaretçi alabilirsiniz.

t := &Thing{}

Ancak bu olasılık da var:

t := new(Thing)

Bu sonuncusu, dilin geri kalanına biraz yabancı gibi görünüyor. &Thing{}olduğu kadar net ve özlüdür new(Thing)ve yalnızca başka yerlerde sık kullandığınız yapıları kullanır. Ayrıca bunu değişebileceği gibi daha genişletilebilir var &Thing{3}ya &Thing{Feets:7}.

Bence, ek bir anahtar kelime 1'e sahip olmak pahalıya mal oluyor, dili daha karmaşık hale getiriyor ve bilmeniz gerekenleri ekliyor. Ve yeni gelenlere bir yapıyı somutlaştırmanın ardında ne olduğunu gizleyebilir.

Aynı zamanda bir daha ayrılmış kelime yapar.

Peki arkasındaki sebep newnedir? Bazen işe yarar mı? Kullanmalı mıyız?


1 : Evet, dilbilgisi düzeyinde bir anahtar kelime olmadığını biliyorum , gölgeyi gölgeleyebilirsiniz , ancak bu makul geliştirici için ayrılmış bir kelime olduğu gerçeğini değiştirmez.


3
"... kodlayıcılara git ..." - sebep bu. F # / Haskell / vb. C geliştiricileri için çok uzaylılar ve bu yüzden ~ 0 traksiyon kazanıyorlar. Scala bir çaba gösterdi ve şimdi daha ulaşılabilir ve duyuldu.
Den

12
Aynı şekilde, Python ve Ruby, pek çok yabancı anahtar kelime, "tuhaf" sözdizimsel kurallar (parantezler nerede?) Ve garip semantik kavramlar (jeneratörler? Metaclass? Dekoratörler?) Kullandıkları için, C geliştiricileri için çok yabancıdır. Yine de tam tersi, ~ 0 çekiş elde edemiyorlar.
Xion,

8
@Xion: Ruby'nin ilk büyüme oranına baktınız mı? Bu sürdü yaş o (18 yaş, kesin olarak) şimdi nerede olsun. Python daha da eskidir (1991!).
Joachim Sauer

2
@AndresF. Scala'ya direnişin bir kısmı dille ilgisi olamazdı. Daha genç bir programcı olarak (25 yaşında), ismin kendisi hakkında bir şeyler beni Matlab (ki onun kötü anılarına sahip olduğum) ve Fortran gibi gerçekten eski bir dil arasında bir çarpı işareti olarak düşündürüyor. Buna bakmak için hiçbir zaman bir dürtü olmadı.
Izkata

4
Yan not: yeni , Go’daki bir anahtar kelime değildir. Bu yerleşik bir işlevdir.
Manish Malik

Yanıtlar:


44

Sormanın en iyi yolu, muhtemelen üzerinde çalışan insanlardır; tam olarak ne yaptım !

Tl; dr: orjinal olarak daha önce oradaydı makeve &{}hala bazı durumlarda kullanılacak fonksiyondu.

Temel olarak, işte alıntılanan en önemli kısımlar:

Peki, yeni arkasındaki sebep nedir? İşe yarar bir şey mi? Kullanmalı mıyız?

Bunu yeni olmadan yapamazsınız.

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

yeni Go'nun bir başlık özelliği değil, sık kullandığını bulamazsınız, ancak ihtiyacınız olduğunda oradadır.

Şerefe

Dave

Bu tür bir çözümü gösteren bir cevaptan sonra:

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

Daha fazla açıklama için sordum:

Yani, temelde, Dave'in amacı gerçekten ayakta değil mi?

Adresini almak için yeni bir değişkene gizlice girmenin sakıncalı olduğu yerler var.

new (T) 'nin çok adımlı bir deyim olmaktan hemen anlaşılır bir anlamı vardır.

Dave'in meselesi, yalnızca teknik bir olasılık (olmadan yapma new) kendi başına zorlayıcıysa düşer .

Bu tartışılmadı çünkü Go'nun buna sahip olması gerektiği açıktı çünkü neredeyse her dilin dili var mıydı?

"Tutalım newmı?" tartışma zaman zaman ortaya çıkıyor. Go 2'ye kadar çıkaramayacağımız için, Sözü doğru anlarsam, tekrar döngüde dolaşacak kadar bir şey yok gibi görünüyor; Go 2'nin düşünülebilir olduğu zaman, daha farklı ve daha iyi fikirlerimiz olabilir ...

Chris

Ayrıca çoğu zaman tarihsel nedenlerle var:

Projenin tarihini düşünmelisin. bence yeni bir şeyler yapmadan önce tanıtıldı.

Bu doğru. Aslında, yapma fikriyle gelmeden önce bir süre mücadele ettik. Depo günlüklerine bakarsanız, yalnızca Ocak 2009'da göründüğünü görebilirsiniz, revizyon 9a924177598f.

Yeni yerleşik işlevi, aynı zamanda bir hazır bilginin adresini almak için & {} fikrinden de önce geldi (ve bu sözdizimi bir anlamda yanlış; büyük olasılıkla (* T) {T} alanı olmalıydı, ancak yeterli değildi. değiştirmek için sebep).

Yeni işlev kesinlikle gerekli değildir, ancak kod pratikte kullanmaktadır. Bu noktada ondan kurtulmak zor.

Ian


Diğerine "yeni mi kalacağız?" Bağlantısını gördüğüm için mutlu olurum. tartışmalar zaman zaman açılır .
Denys Séguret

Bir şey v := &(0)temp değişkeni yapmanızı ve atlamanızı engeller mi ? (
Gitmeyeceğimi

3
@AlexFeinman 0Bir değişmez sabit olduğu için adresini alamazsınız. Siz de belirli bir tür istiyorsanız, bir sorun ortaya çıkar. Bu yüzden gibi &intveya &int(0)yararlı bir sözdizimi (en iyi sözdizimi hakkında çok fazla düşünmedim olsa da). Ancak Collins'in gösterdiği gibi iki satırda yapmak da iyi ( vv := 0; v := &vv).
Denys Séguret

14
“Go 2'ye kadar çıkaramayacağımıza göre” ... ki herkesin bildiği gibi asla olmayacak çünkü Go 2zararlı olarak kabul ediliyor.
Mason Wheeler

2
@MasonWheeler neredeyse beni öldürüyordun ... hala "Go 2'nin zararlı olduğu düşünüldü" de ...
Daniela Petruzalek
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.