Kekeliruan tentang Menukar uint8 kepada int8
Apabila menukar uint8 (integer 8-bit tidak ditandatangani) kepada int8 (integer 8-bit yang ditandatangani ), hasilnya mungkin tidak selalu seperti yang diharapkan. Artikel ini meneroka perbezaan antara dua pendekatan berikut dan menerangkan sebab yang pertama menimbulkan ralat kompilasi:
<code class="go">a := int8(0xfc) // compile error // deferring type conversion a := 0xfc b := int8(a) </code>
Perbezaan Antara Kod
Perbezaan antara kedua-dua kod tersebut terletak pada susunan operasi:
Ralat Kompilasi dalam Kod Pertama
Kod pertama menimbulkan ralat kompilasi kerana pemalar 0xfc melebihi julat jenis int8. int8 boleh mewakili nilai antara -128 dan 127, manakala 0xfc ialah 252 dalam perpuluhan, yang melebihi julat ini. Menurut spesifikasi bahasa Go, ungkapan pemalar mesti sentiasa boleh diwakili dengan tepat oleh nilai jenis pemalar.
Ungkapan Malar yang Sah dan Tidak Sah
Rujuk https:// golang.org/ref/spec#Constant_expressions untuk penjelasan terperinci tentang ungkapan pemalar yang sah dan tidak sah. Catatan blog di https://blog.golang.org/constants memberikan cerapan tambahan tentang pengehadan jenis integer dan kepentingan pemalar semakan jenis untuk menangkap ralat.
Menyelesaikan Isu Penukaran
Jika matlamat anda adalah untuk menukar bait (iaitu uint8) kepada int32 sambil mempertimbangkan tandanya, pendekatan yang disyorkan ialah menukarnya terlebih dahulu kepada int8 dan kemudian kepada int32:
<code class="go">var b byte = 0xff i32 := int32(int8(b)) // -1</code>
Atas ialah kandungan terperinci Mengapakah Menukar uint8 kepada int8 dengan Gagal Malar dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!