Dalam pengaturcaraan, adalah perkara biasa untuk menghadapi situasi di mana anda perlu menaip menegaskan sepotong nilai antara muka. Walau bagaimanapun, ini kadangkala boleh membawa kepada kesilapan. Mari kita selidiki sebab mengapa penegasan sekeping nilai antara muka mungkin tidak selalu boleh dilaksanakan.
Apabila cuba menaip assert kepada jenis tertentu, seperti []Simbol, daripada secebis nilai antara muka, []Nod , seperti dalam contoh yang disediakan:
args.([]Symbol)
Anda mungkin menghadapi ralat berikut:
invalid type assertion: args.([]Symbol) (non-interface type []Node on left)
Ini ralat timbul kerana kepingan, seperti []Node, bukan jenis antara muka, tidak seperti Node itu sendiri. Sesuatu keping mempunyai jenis tersendiri dengan set tingkah laku dan kaedahnya sendiri. Oleh itu, ia tidak mempunyai kecairan dan kebolehsuaian antara muka, yang membolehkan jenis asas berubah secara dinamik.
Walaupun kelihatan mudah untuk menganggap sepotong nilai antara muka sebagai antara muka, ia secara asasnya melanggar konsep menaip . Dalam contoh di atas, niatnya adalah untuk menukar kepingan args menjadi kepingan nilai Simbol. Walau bagaimanapun, memandangkan args ialah sekeping nilai Nod, penegasan jenis mudah tidak boleh dilakukan.
Untuk mengendalikan situasi ini dengan betul, anda boleh menggunakan pendekatan alternatif:
symbols := make([]Symbol, len(args)) for i, arg := range args { symbols[i] = arg.(Symbol) }
Kod ini mencipta kepingan baharu nilai Simbol, simbol dan lelaran di atas kepingan args, menukar setiap elemen kepada Simbol menggunakan penegasan jenis. Penukaran manual ini memastikan setiap elemen dalam kepingan yang terhasil mematuhi jenis yang diingini, memberikan kefungsian yang diingini tanpa memerlukan penegasan jenis yang tidak sah.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menaip Dengan Betul Menegaskan Secebis Nilai Antara Muka dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!