Struktur Tanpa Nama: Mendedahkan Perbezaan antara struct{}{} dan {}
Dalam Go, mengisytiharkan peta struct rentetan kepada tanpa nama boleh dilakukan dalam dua cara:
<code class="go">var Foo = map[string]struct{}{ "foo": struct{}{}, }</code>
<code class="go">var Foo = map[string]struct{}{ "foo": {}, }</code>
Walaupun kedua-dua ungkapan sah, yang kedua menimbulkan amaran di Gogland mengenai "Pengisytiharan jenis berlebihan." Untuk menjelaskannya, mari kita terokai perbezaan asas antara kedua-dua bentuk ini.
Pertama, pertimbangkan perkara berikut:
<code class="go">struct{}{}</code>
Ini ialah literal komposit yang terdiri daripada jenis (struct{}) dan nilai ({}). Sebaliknya, ini:
<code class="go">{}</code>
Merupakan literal komposit yang meninggalkan jenis dan hanya mengekalkan nilai.
Biasanya, literal komposit memerlukan kemasukan spesifikasi jenis untuk membantu pengkompil dalam mengenal pasti jenis yang dimaksudkan. Mengikut spesifikasi bahasa:
CompositeLit = LiteralType LiteralValue .
Walau bagaimanapun, apabila mentakrifkan literal komposit peta, jenis kunci dan nilai sudah ditentukan oleh jenis peta. Oleh itu, dalam kes di mana anda bercadang untuk memberikan nilai jenis yang ditentukan ini, spesifikasi jenis boleh ditinggalkan.
Peninggalan ini dibenarkan oleh spesifikasi Go, yang menyatakan:
"Within a composite literal of array, slice, or map type T, elements or map keys that are themselves composite literals may elide the respective literal type if it is identical to the element or key type of T."
Sebagai kesimpulan , dua ungkapan yang dibentangkan pada permulaan mencapai hasil akhir yang sama. Walau bagaimanapun, yang kedua memanfaatkan ciri bahasa yang membenarkan peninggalan spesifikasi jenis berlebihan dalam literal komposit peta.
Atas ialah kandungan terperinci Struktur Tanpa Nama dalam Go: Bilakah lebihan untuk Menentukan Jenis dalam `map[rentetan]struct{}`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!