Dalam Go, selalunya perlu merujuk struct sebagai penunjuk, terutamanya apabila bekerja dengan berorientasikan objek corak. Walau bagaimanapun, apabila membenamkan struct dalam struct lain yang digunakan sebagai penunjuk, terdapat pilihan yang perlu dibuat: benamkan struct itu sendiri atau penunjuk kepadanya. Keputusan ini mempunyai implikasi halus yang boleh menjejaskan tingkah laku kod.
Pertimbangkan kod berikut:
<code class="go">type B struct { X int } type A struct { B }</code>
Di sini, struct B dibenamkan terus dalam A struct. Nilai sifar A termasuk objek terbenam jenis B, yang juga mempunyai nilai sifarnya. Akibatnya, kami boleh memanggil kaedah Cetak objek B terbenam dengan selamat:
<code class="go">var a A a.Print() // prints 0</code>
Sebaliknya, pertimbangkan kod berikut:
<code class="go">type B struct { X int } type A struct { *B }</code>
Di sini, struct B dibenamkan sebagai penunjuk dalam struct A. Nilai sifar A mempunyai nilai penunjuk sifar untuk *B tertanam. Percubaan untuk memanggil kaedah Cetak pada objek *B terbenam akan mengakibatkan panik:
<code class="go">var a A a.Print() // panics</code>
Apabila mencipta objek baharu jenis ini, tingkah laku berbeza:
Pilihan antara membenamkan struct secara langsung atau menggunakan penunjuk bergantung pada kes penggunaan yang dimaksudkan. Membenamkan struct memberikan kemudahan untuk mengakses medan terbenam secara langsung, manakala membenamkan penuding membenarkan pengubahsuaian pada struct terbenam untuk mempengaruhi berbilang salinan. Memahami implikasi ini memastikan penggunaan yang betul dan mengelakkan kemungkinan perangkap dalam kod anda.
Atas ialah kandungan terperinci Benamkan Struct atau Penunjuk kepada Struct dalam Go: Bilakah Anda Harus Memilih Apa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!