Rumah >pembangunan bahagian belakang >Golang >Mengapakah Saya Tidak Boleh Menukar Sekeping `Foo` kepada Sekeping `Bar` dalam Go?

Mengapakah Saya Tidak Boleh Menukar Sekeping `Foo` kepada Sekeping `Bar` dalam Go?

Susan Sarandon
Susan Sarandonasal
2024-10-26 10:03:02253semak imbas

Why Can't I Convert a Slice of `Foo` to a Slice of `Bar` in Go?

Mengapa Go Tidak Membenarkan Penukaran Jenis Slice (cth. []Foo to []Bar)

Pengenalan

Dalam Go, memberikan satu nilai kepada pembolehubah jenis yang berbeza biasanya tidak dibenarkan kerana peraturan keselamatan dan penukaran jenis. Seperti yang anda temui, anda tidak boleh menukar kepingan struktur satu jenis (cth. []Foo) kepada kepingan jenis yang berbeza (cth. []Bar). Artikel ini bertujuan untuk menjelaskan sebab penukaran ini tidak boleh dilakukan, walaupun jenis asas Foo dan Bar mungkin sama.

Peraturan Penukaran

Mengikut spesifikasi Go , nilai x tidak tetap boleh ditukar kepada jenis T hanya jika salah satu daripada kriteria berikut dipenuhi:

  • x boleh diserahkan kepada T.
  • Jenis asas x dan T adalah sama.
  • x dan T ialah jenis penunjuk tidak dinamakan dengan jenis asas yang sama.
  • x dan T ialah kedua-dua jenis integer, titik terapung atau kompleks.
  • x ialah integer atau kepingan bait/rune, dan T ialah jenis rentetan.
  • x ialah rentetan, dan T ialah kepingan bait/rune.

Jenis Kepingan Dasar

Jenis asas hirisan ialah penunjuk kepada jenis elemen. Sebagai contoh, jenis asas []Foo ialah []Foo, dan jenis asas []Bar ialah []Bar. Walaupun jenis asas Foo adalah sama dengan jenis asas Bar, ini tidak diterjemahkan kepada jenis asas yang sama untuk kepingan Foo dan Bar.

Sebab Tidak Penukaran

Penyelesaian Alternatif

Satu penyelesaian yang mungkin untuk isu ini adalah dengan mentakrifkan alias jenis tersuai untuk sepotong Foo, seperti Foos. Ini membolehkan anda membuat kepingan Bar daripada kepingan Foos, seperti yang digambarkan dalam kod berikut:

Dalam kes ini, jenis asas Foos dan Bar adalah sama dan penukaran berfungsi sebagai dijangka.
<code class="go">type Foo struct{ A int }
type Foos []Foo
type Bars Foos

func main() {
    foos := []Foo{Foo{1}, Foo{2}}
    bars := Bars(foos)

    fmt.Println(bars)
}</code>

Pertimbangan Pakej Tidak Selamat

Walaupun Go secara amnya melarang operasi yang tidak selamat, adalah mungkin untuk menggunakan pakej yang tidak selamat untuk memintas sekatan penukaran. Walau bagaimanapun, ini harus dilakukan dengan berhati-hati dan memahami kemungkinan akibat, kerana ia boleh menjejaskan keselamatan jenis.

Kesimpulan

Memahami peraturan penukaran dan jenis asas kepingan ialah penting untuk mengendalikan penukaran jenis dalam Go. Walaupun penukaran terus antara kepingan jenis elemen berbeza tidak dibenarkan, terdapat penyelesaian alternatif, seperti menentukan alias jenis tersuai, untuk mencapai kefungsian yang diingini sambil mengekalkan keselamatan jenis.

Atas ialah kandungan terperinci Mengapakah Saya Tidak Boleh Menukar Sekeping `Foo` kepada Sekeping `Bar` dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn