Um die Endianness einer Maschine zu bestimmen, kann man den folgenden Go-Code verwenden:
<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>
Dieser Ansatz basiert jedoch auf dem unsicheren Paket, was zu nicht tragbarem und potenziell unsicherem Code führen kann. Glücklicherweise bietet die TensorFlow-API für Go eine alternative Lösung, die ebenfalls das unsichere Paket nutzt, jedoch auf robustere Weise:
<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>
Dieses Code-Snippet macht sich die Tatsache zunutze, dass ein uint16 in einem 2. gespeichert werden kann -Byte-Puffer, und die Reihenfolge der Bytes hängt von der Endianness des Systems ab. Durch die Untersuchung der Anordnung der Bytes im Puffer bestimmt der Code die Endianness des Systems und legt die nativeEndian-Variable entsprechend fest.
Die Verwendung dieser Methode bietet eine zuverlässigere Möglichkeit, die Endianness in Go zu überprüfen und gleichzeitig die auferlegten Einschränkungen einzuhalten durch das unsichere Paket.
Das obige ist der detaillierte Inhalt vonWie kann man Endianness in Go bestimmen, ohne Einbußen bei der Sicherheit hinnehmen zu müssen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!