Rumah  >  Artikel  >  pembangunan bahagian belakang  >  ralat golang: "tidak boleh menggunakan x (jenis y) sebagai jenis z dalam julat..." Bagaimana untuk menyelesaikannya?

ralat golang: "tidak boleh menggunakan x (jenis y) sebagai jenis z dalam julat..." Bagaimana untuk menyelesaikannya?

WBOY
WBOYasal
2023-06-25 15:47:551075semak imbas

Di Golang, pernyataan julat ialah cara yang mudah untuk melintasi struktur data seperti tatasusunan, kepingan, rentetan dan peta. Walau bagaimanapun, apabila kami menggunakan pernyataan julat, kadangkala kami menghadapi ralat biasa: "tidak boleh menggunakan x (jenis y) sebagai jenis z dalam julat...". Artikel ini bertujuan untuk memperkenalkan punca ralat ini dan cara menyelesaikannya.

  1. Punca ralat

Sebab ralat ini ialah apabila menggunakan pernyataan julat, jenis pembolehubah yang dilalui adalah tidak konsisten dengan jenis yang dijangkakan oleh julat. Khususnya, ralat ini biasanya berlaku dalam dua situasi berikut:

Kes 1: Pembolehubah yang dilalui melaksanakan fungsi julat haram

Sebagai contoh, kami mentakrifkan pembolehubah rentetan jenis bernama myVar, dan kemudian dalam Apabila menggunakan julat, kerana ini rentetan tidak melaksanakan fungsi julat, ralat di atas akan berlaku.

var myVar string = "Hello, World!"

for index, value := range myVar {
    fmt.Println(index, string(value))
}

Kes 2: Jenis pembolehubah yang dilalui adalah tidak konsisten dengan jenis yang dijangkakan oleh julat

Sebagai contoh, kami mentakrifkan pembolehubah bernama myVar dengan jenis []int, dan apabila menggunakan julat, kami menjangkakan bahawa dalam setiap lelaran gelung Akses nilai jenis int.

var myVar []int = []int{1, 2, 3, 4, 5}

for _, value := range myVar {
    fmt.Println(string(value)) // 报错:cannot use value (type int) as type string in argument to string
}

Untuk contoh lain, jika kita mentakrifkan pembolehubah bernama myVar antara muka jenis{}, dan apabila menggunakan julat, kami menjangkakan untuk mengakses nilai rentetan jenis dalam setiap lelaran gelung, ralat di atas juga akan berlaku.

var myVar interface{} = []string{"Hello", "World"}

for _, value := range myVar {
    fmt.Println(value.(int)) // 报错:cannot use value (type string) as type int in argument to .(int)
}
  1. Penyelesaian

Cara untuk menyelesaikan masalah ini adalah terutamanya dengan membezakan berdasarkan dua situasi di atas. Secara khusus, langkah berikut boleh diambil untuk menyelesaikan masalah ini:

Langkah 1: Semak sama ada pembolehubah yang dilalui melaksanakan fungsi julat

Jika ini kes 1, kita perlu menyemak sama ada pemboleh ubah yang dilalui melaksanakan fungsi julat. Jika ia tidak dilaksanakan, kita perlu mengubahnya untuk mematuhi keperluan pernyataan julat.

Sebagai contoh, dalam contoh di atas, kita boleh menukar jenis myVar kepada []rune, supaya kita boleh menggunakan pernyataan julat untuk melintasi rentetan.

var myVar []rune = []rune("Hello, World!")

for index, value := range myVar {
    fmt.Println(index, string(value))
}

Langkah 2: Tukar pemboleh ubah yang dilalui kepada jenis yang betul

Jika kes 2, kita perlu menukar pemboleh ubah yang dilalui kepada jenis yang betul untuk mematuhi keperluan jenis yang dijangka mengikut julat.

Sebagai contoh, dalam contoh di atas, kita perlu menggantikan int dalam fmt.Println(value.(int)) dengan rentetan supaya setiap elemen boleh diakses dengan betul.

var myVar interface{} = []string{"Hello", "World"}

for _, value := range myVar.([]string) {
    fmt.Println(value)
}

Langkah 3: Gunakan penegasan untuk memastikan ketepatan jenis pembolehubah

Jika kita tidak mengetahui jenis pembolehubah tertentu yang dilalui apabila menggunakan pernyataan julat, kita boleh menggunakan penegasan untuk memastikan ketepatan jenis pembolehubah . Sebagai contoh, dalam contoh berikut, kami menggunakan pengendali penegasan pada pembolehubah yang diulang.

func printValues(values interface{}) {
    switch v := values.(type) {
        case []string:
            for _, value := range v {
                fmt.Println(value)
            }
        case []int:
            for _, value := range v {
                fmt.Println(value)
            }
    }
}

Ringkasnya, sebab ralat ini ialah apabila kita menggunakan pernyataan julat, jenis pembolehubah yang dilalui adalah tidak konsisten dengan jenis yang dijangkakan oleh julat. Kita boleh menyelesaikan masalah ini dengan menyemak sama ada pembolehubah lelaran melaksanakan fungsi julat, menukar pembolehubah lelaran kepada jenis yang betul dan menggunakan penegasan untuk memastikan ketepatan jenis pembolehubah.

Atas ialah kandungan terperinci ralat golang: "tidak boleh menggunakan x (jenis y) sebagai jenis z dalam julat..." Bagaimana untuk menyelesaikannya?. 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