Golang: unsichere dynamischen byte-array
Ich versuche, die Schnittstelle mit einem Windows-dll mit Gehen. Die dll-Funktion, die ich verwenden möchten, akzeptiert einen Zeiger auf ein byte-array. Also ich muss zu geben, dass byte-array.
Ich bin mit dem syscall Bibliothek aufrufen, die dll ist, wie gezeigt,hier. Meine grundlegenden Anforderungen sind:
- Ich die erforderliche Größe für das byte-array
- Ich das byte-array
- Ich muss einen Zeiger auf das byte-array
- Ich dann übergeben Sie den Zeiger, um die Windows-dll
Ich kann nicht herausfinden, wie man erstellen Sie ein byte-array in gehen, und einen Zeiger darauf. Dies ist natürlich ein unsicherer Betrieb, und die unsicher Bibliothek kann hilfreich sein, aber ich brauche zum erstellen einer dynamic-length byte-array in den ersten Platz. Erstellen Sie eine Scheibe mit "machen" hilft mir nicht, es sei denn, ich kann einen Zeiger auf die Scheibe background-array.
Hat sonst noch jemand Probleme oder irgendwelche Ideen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, syscall.ComputerName Umsetzung https://golang.org/src/syscall/syscall_windows.go#395 wäre ein gutes Beispiel. Es nutzt uint16s, nicht bytes, aber ansonsten ...
In deinem Fall wäre es
ptr := &myslice[0]
.Alex
ptr := &myslice[0]
Nun fand ich eine grobe Lösung. Anscheinend ist der Struktur der Scheibe enthält einen Zeiger auf die Unterstützung byte-array, das die Länge der backing-byte-array, und dann die Kapazität der backing-byte-array.
Ich bin nur daran interessiert, einen Zeiger auf das byte-array, also brauche ich nur das erste Mitglied der Scheibe, die internen Daten.
Go
unsafe.Pointer
wird nicht gegossen, eine Scheibe, die eine unsichere Zeiger, aber es wird Stimmen einen Zeiger auf einer Scheibe als eine unsichere Zeiger. Da kann ich warf einen unsicheren Zeiger auf jede alte Art der Zeiger, ich will, ich kann es Stimmen, um einen Zeiger an einen Zeiger, der gewinnt das erste Mitglied der Scheibe, die internen Daten.Hier ist ein funktionierendes Beispiel. Ich wollte eine
uintptr
aber man könnte es Stimmen zu jedem Zeiger-Typ.Wenn Sie wollte einen
*int
Sie stattdessen tun könntenmPtr := *(**int)(unsafe.Pointer(&m))
Dies funktioniert so lange, als eine Scheibe hält dieser internen Datenstruktur. Ich bin auf jeden Fall offen für eine robuste Lösung, die nicht abhängig von der Struktur der Go ' s-Interna.