Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menentukan Endianness dalam Pergi tanpa Mengorbankan Keselamatan?

Bagaimana untuk Menentukan Endianness dalam Pergi tanpa Mengorbankan Keselamatan?

Barbara Streisand
Barbara Streisandasal
2024-11-03 01:54:02720semak imbas

How to Determine Endianness in Go without Sacrificing Safety?

Penyelesaian Komprehensif untuk Menentukan Endianness dalam Go

Untuk menentukan endianness mesin, seseorang boleh mempertimbangkan untuk menggunakan kod Go berikut:

<code class="go">var i int = 0x0100
ptr := unsafe.Pointer(&i)
if 0x01 == *(*byte)(ptr) {
    fmt.Println("Big Endian")
} else if 0x00 == *(*byte)(ptr) {
    fmt.Println("Little Endian")
} else {
    // ...
}</code>

Walau bagaimanapun, pendekatan ini bergantung pada pakej yang tidak selamat, yang boleh membawa kepada kod yang tidak mudah alih dan berkemungkinan tidak selamat. Nasib baik, TensorFlow API for Go menyediakan penyelesaian alternatif yang turut menggunakan pakej yang tidak selamat tetapi dengan cara yang lebih mantap:

<code class="go">var nativeEndian binary.ByteOrder

func init() {
    buf := [2]byte{}
    *(*uint16)(unsafe.Pointer(&buf[0])) = uint16(0xABCD)

    switch buf {
    case [2]byte{0xCD, 0xAB}:
        nativeEndian = binary.LittleEndian
    case [2]byte{0xAB, 0xCD}:
        nativeEndian = binary.BigEndian
    default:
        panic("Could not determine native endianness.")
    }
}</code>

Coretan kod ini mengambil kesempatan daripada fakta bahawa uint16 boleh disimpan dalam 2 -byte buffer, dan susunan bait akan bergantung pada endianness sistem. Dengan memeriksa susunan bait dalam penimbal, kod menentukan endian sistem dan menetapkan pembolehubah nativeEndian dengan sewajarnya.

Menggunakan kaedah ini menyediakan cara yang lebih dipercayai untuk menyemak endian dalam Go sambil tetap mematuhi had yang dikenakan oleh pakej yang tidak selamat.

Atas ialah kandungan terperinci Bagaimana untuk Menentukan Endianness dalam Pergi tanpa Mengorbankan Keselamatan?. 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