Detaillierte Erklärung des unsicheren Pakets in Golang

Das unsichere Paket in Golang wird zur Laufzeit für Low-Level-Vorgänge verwendet. Diese Vorgänge sind im Allgemeinen unsicher, da sie die Typ- und Speichersicherheit von Golang beeinträchtigen können und Programme, die unsichere Pakete verwenden, die Portabilität und Kompatibilität beeinträchtigen können. Schauen Sie sich als Nächstes die Typen und Funktionen im unsicheren Paket an.

unsicher. Zeigertyp

Wird normalerweise für die Typkonvertierung und Zeigerarithmetik verwendet und ist wie folgt definiert:

type Pointer *ArbitraryType

Zeiger anderer Typen können zur Manipulation auf niedriger Ebene in den Typ „unsafe.Pointer“ konvertiert werden. Schauen Sie sich ein einfaches Beispiel an:

package main
 
import (
	"fmt"
	"unsafe"
)
 
func main() {
	i := 30
	ptr1 := &i
 
	var ptr2 *int64 = (*int64)(unsafe.Pointer(ptr1))
	*ptr2 = 8
 
	fmt.Println(i)
}

unsafe.ArbitraryType-Typ

Es ist wie folgt definiert:

type ArbitraryType int

ArbitraryType wird nur zu Dokumentationszwecken verwendet und ist eigentlich nicht Teil des unsicheren Pakets, um den Typ eines beliebigen Go-Ausdrucks darzustellen.

unsafe.IntegerType-Typ

Es ist wie folgt definiert:

type IntegerType int

IntegerType wird nur zu Dokumentationszwecken verwendet und ist eigentlich nicht Teil des unsicheren Pakets zur Darstellung beliebiger Ganzzahltypen.

unsicher. Funktion hinzufügen

Es ist wie folgt definiert:

func Add(ptr Pointer, len IntegerType) Pointer

Es wird für die Zeigeradditionsoperation verwendet, bei der ein Zeiger und der angegebene Offset hinzugefügt werden, um einen neuen Zeiger zu erhalten. Ein einfaches Beispiel ist wie folgt:

package main

import (
	"fmt"
	"unsafe"
)

func main() {
	arr := []int{1, 2, 3, 4}
	index := 2
	ptr := unsafe.Pointer(&arr[0])
	newPtr := unsafe.Add(ptr, uintptr(index)*unsafe.Sizeof(arr[0]))
	cc := (*int)(newPtr)
	fmt.Println(*cc)
	fmt.Println(newPtr)
}

unsicher. Sizeof Function

Es ist wie folgt definiert:

func Sizeof(x ArbitraryType) uintptr

Wird verwendet, um die Größe eines Typs oder Werts in Bytes abzurufen. Ein einfaches Beispiel ist wie folgt:

package main

import (
	"fmt"
	"unsafe"
)

func main() {
	var arr [5]int
	fmt.Println(unsafe.Sizeof(arr)) // 输出: 40
	fmt.Println(unsafe.Sizeof(0))   // 输出: 8
}

unsicher.Slice-Funktion

Es ist wie folgt definiert:

func Slice(ptr *ArbitraryType, len IntegerType) []ArbitraryType

Wird zum Erstellen eines Slice verwendet, das die zugrunde liegenden Daten mit dem ursprünglichen Array teilt. Ein einfaches Beispiel ist wie folgt:

package main

import (
	"fmt"
	"unsafe"
)

func main() {
	var arr [5]int
	arr[0] = 10
	arr[1] = 20
	arr[2] = 30
	arr[3] = 40
	arr[4] = 50

	slice := unsafe.Slice(&arr[0], 3)
	fmt.Println(slice) // 输出: [10 20 30]
}

Definieren Sie ein Array arr mit 5 Ganzzahlen und verwenden Sie dann die Funktion unsafe.Slice, um ein Slice-Slice zu erstellen, das bei Index 0 beginnt und eine Länge von 3 hat.

unsicher.Offsetof

Es ist wie folgt definiert:

func Offsetof(x ArbitraryType) uintptr

Die Funktion besteht darin, die Anzahl der Bytes von der Position des Strukturelements im Speicher bis zum Anfang der Struktur zurückzugeben (der Offset des ersten Felds der Struktur ist 0). Ein einfaches Beispiel ist wie folgt:

package main

import (
	"fmt"
	"unsafe"
)

type MyStruct struct {
	Field1 int64
	Field2 string
}

func main() {
	var myStruct MyStruct
	fmt.Println(unsafe.Offsetof(myStruct.Field1)) // 输出: 0
	fmt.Println(unsafe.Offsetof(myStruct.Field2)) // 输出: 8
}

unsicher.Alignof

Es ist wie folgt definiert:

func Alignof(x ArbitraryType) uintptr

Gibt die Anzahl der Bytes zurück, die zum Ausrichten des Arguments erforderlich sind. Bei einigen Strukturen kann sich die Speicherausrichtung ihrer Felder auf die von der Struktur belegte Speichergröße auswirken. Ein einfaches Beispiel ist wie folgt:

package main

import (
	"fmt"
	"unsafe"
)

type MyStruct struct {
	Field1 int
	Field2 string
}

func main() {
	fmt.Println(unsafe.Alignof(int(0)))     // 输出: 8
	fmt.Println(unsafe.Alignof(string(""))) // 输出: 8
	fmt.Println(unsafe.Alignof(MyStruct{})) // 输出: 8
}

Zusammenfassung

Das unsichere Paket stellt einige Operationen auf niedriger Ebene bereit. Sie müssen bei der Verwendung vorsichtig sein. Sie müssen sich genau darüber im Klaren sein, was Sie tun, um die Einführung unsicherer Probleme zu vermeiden.

Ich denke du magst

Origin blog.csdn.net/luduoyuan/article/details/132219469
Empfohlen
Rangfolge