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.