In Go wird eine Variable unerreichbar, wenn die Go-Laufzeit feststellt, dass der Code nicht erneut auf die Variable verweist. Dies kann auch dann auftreten, wenn sich die Variable noch in ihrem Gültigkeitsbereich befindet.
Beispiel:
Bedenken Sie den folgenden Codeausschnitt:
type File struct { d int } func main() { d, err := syscall.Open("/file/path", syscall.O_RDONLY, 0) if err != nil { return } p := &File{d} runtime.SetFinalizer(p, func(p *File) { syscall.Close(p.d) }) var buf [10]byte n, err := syscall.Read(p.d, buf[:]) runtime.KeepAlive(p) }
In diesem Beispiel wird die Variable p nach dem syscall.Read-Aufruf nicht mehr verwendet. Es liegt jedoch immer noch im Bereich der Hauptfunktion.
Die Laufzeit kann p als nicht erreichbar markieren, da ihr Finalizer erst ausgeführt wird, wenn syscall.Read zurückkehrt. Der Systemaufruf ist für die Referenzierung und Verwendung des p.d-Dateideskriptors verantwortlich.
KeepAlive-Funktion:
Um zu verhindern, dass p frühzeitig als nicht erreichbar markiert wird, ist die Funktion runtime.KeepAlive vorhanden gebraucht. Diese Funktion informiert die Laufzeit darüber, dass p weiterhin verwendet wird, auch wenn im Code nicht darauf verwiesen wird. Dadurch wird sichergestellt, dass der Finalizer erst ausgeführt wird, wenn syscall.Read zurückkehrt.
Wichtige Punkte:
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3