Saya tahu bahwa pointer di Go memungkinkan mutasi argumen fungsi, tetapi bukankah akan lebih sederhana jika mereka hanya mengadopsi referensi (dengan const yang sesuai atau qualifier yang dapat berubah). Sekarang kami memiliki pointer dan untuk beberapa tipe bawaan seperti peta dan saluran melalui referensi implisit.
Apakah saya melewatkan sesuatu atau apakah petunjuk di Go hanya merupakan komplikasi yang tidak perlu?
Jawaban:
Saya sangat suka contoh yang diambil dari http://www.golang-book.com/8
sebagai kontras dengan
sumber
Pointer berguna karena beberapa alasan. Pointer memungkinkan kontrol atas tata letak memori (memengaruhi efisiensi cache CPU). Di Go kita dapat mendefinisikan struktur di mana semua anggota berada dalam memori yang berdekatan:
Dalam hal ini
Point
struktur disematkan di dalamLineSegment
struct. Tetapi Anda tidak selalu dapat menyematkan data secara langsung. Jika Anda ingin mendukung struktur seperti pohon biner atau daftar tertaut, Anda perlu mendukung beberapa jenis penunjuk.Java, Python, dll. Tidak memiliki masalah ini karena tidak memungkinkan Anda untuk menyematkan tipe komposit, jadi tidak perlu membedakan secara sintaks antara penyematan dan penunjuk.
Masalah dengan struktur Swift / C # diselesaikan dengan petunjuk Go
Alternatif yang mungkin untuk mencapai hal yang sama adalah dengan membedakan antara
struct
danclass
seperti yang dilakukan C # dan Swift. Tetapi ini memang memiliki batasan. Meskipun Anda biasanya dapat menentukan bahwa suatu fungsi menggunakan struct sebagaiinout
parameter untuk menghindari penyalinan struct, fungsi tersebut tidak memungkinkan Anda untuk menyimpan referensi (pointer) ke struct. Ini berarti Anda tidak akan pernah bisa memperlakukan struct sebagai tipe referensi ketika Anda merasa berguna misalnya untuk membuat pengalokasi kumpulan (lihat di bawah).Alokasi Memori Kustom
Dengan menggunakan pointer, Anda juga dapat membuat pengalokasi pool Anda sendiri (ini sangat disederhanakan dengan banyak pengecekan dihapus untuk hanya menunjukkan prinsip):
Tukar dua nilai
Pointer juga memungkinkan Anda untuk mengimplementasikan
swap
. Itu menukar nilai dari dua variabel:Kesimpulan
Java tidak pernah dapat sepenuhnya menggantikan C ++ untuk pemrograman sistem di tempat-tempat seperti Google, sebagian karena kinerja tidak dapat disetel ke tingkat yang sama karena kurangnya kemampuan untuk mengontrol tata letak dan penggunaan memori (cache miss mempengaruhi kinerja secara signifikan). Go bertujuan untuk menggantikan C ++ di banyak area dan karenanya perlu mendukung petunjuk.
sumber
Referensi tidak dapat dialihkan, sementara pointer bisa. Ini saja membuat petunjuk berguna dalam banyak situasi di mana referensi tidak dapat digunakan.
sumber
Go dirancang untuk menjadi bahasa yang singkat dan minimalis. Oleh karena itu, ini dimulai hanya dengan nilai dan petunjuk. Kemudian, jika perlu, beberapa jenis referensi (irisan, peta, dan saluran) ditambahkan.
Bahasa Pemrograman Go: Desain Bahasa FAQ: Mengapa peta, irisan, dan saluran menjadi referensi sedangkan array adalah nilai?
"Ada banyak sejarah tentang topik itu. Awalnya, peta dan saluran adalah penunjuk secara sintaksis dan tidak mungkin untuk mendeklarasikan atau menggunakan contoh non-penunjuk. Selain itu, kami berjuang dengan cara kerja array. Akhirnya kami memutuskan bahwa pemisahan yang ketat pointer dan nilai membuat bahasa lebih sulit untuk digunakan. Memperkenalkan jenis referensi, termasuk irisan untuk menangani bentuk referensi array, menyelesaikan masalah ini. Jenis referensi menambahkan beberapa kompleksitas yang disesalkan ke bahasa tetapi mereka memiliki pengaruh besar pada kegunaan: Go menjadi a bahasa yang lebih produktif dan nyaman saat diperkenalkan. "
Kompilasi cepat adalah tujuan desain utama dari bahasa pemrograman Go; itu ada biayanya. Salah satu korban tampaknya adalah kemampuan untuk menandai variabel (kecuali untuk konstanta waktu kompilasi dasar) dan parameter sebagai tidak dapat diubah. Sudah diminta, tapi ditolak.
golang-kacang: pergi bahasa. Beberapa umpan balik dan keraguan.
"Menambahkan const ke sistem tipe memaksanya untuk muncul di mana-mana, dan memaksa seseorang untuk menghapusnya di mana-mana jika ada perubahan. Meskipun mungkin ada beberapa manfaat untuk menandai objek yang tidak dapat diubah dalam beberapa cara, kami tidak berpikir kualifikasi tipe const adalah cara yang tepat. untuk pergi."
sumber