package
1.23.0
Repository: https://github.com/shogo82148/std.git
Documentation: pkg.go.dev

# Functions

NewHandleは指定された値のハンドルを返します。 このハンドルはprogramがそれに対してDeleteを呼び出すまで有効です。ハンドルはリソースを使用し、 このパッケージではCコードがハンドルを保持している可能性があるため、プログラムはハンドルが不要になったら 明示的にDeleteを呼び出す必要があります。 この関数の意図された使用方法は、返されたハンドルをCコードに渡し、 CコードがそれをGoに戻し、GoがValueを呼び出すことです。.

# Structs

Incompleteは不完全なCの型のセマンティクスに特に使われます。.

# Type aliases

Handleは、Goで割り当てられたメモリのポインタ(Goのポインタ)を含む値を、 cgoのポインタ渡し規則を破ることなく、GoとCの間でやり取りするための手段を提供します。 Handleは、任意のGoの値を表すことができる整数値です。 Handleは、Cを介してGoに渡すことも、Goのコードで元のGoの値を取得するためにHandleを使用することもできます。 Handleの基になる型は、ポインタのビットパターンを保持できるだけの十分に大きな整数型に収まることが保証されています。 Handleのゼロ値は無効であり、CのAPIでセンチネルとして安全に使用することができます。 たとえば、Goの側では: package main /* #include <stdint.h> // for uintptr_t extern void MyGoPrint(uintptr_t handle); void myprint(uintptr_t handle); */ import "C" import "runtime/cgo" //export MyGoPrint func MyGoPrint(handle C.uintptr_t) { h := cgo.Handle(handle) val := h.Value().(string) println(val) h.Delete() } func main() { val := "hello Go" C.myprint(C.uintptr_t(cgo.NewHandle(val))) // Output: hello Go } Cの側では: #include <stdint.h> // for uintptr_t // A Go function extern void MyGoPrint(uintptr_t handle); // A C function void myprint(uintptr_t handle) { MyGoPrint(handle); } 特定のCの関数は、呼び出し元が提供した任意のデータの値を指すvoid*引数を受け入れます。 [cgo.Handle](整数)をGoの [unsafe.Pointer] に強制変換することは安全ではありませんが、 代わりにcgo.Handleのアドレスをvoid*パラメータに渡すことができます。次に示す前の例のバリアントでは、このようにします。 package main /* extern void MyGoPrint(void *context); static inline void myprint(void *context) { MyGoPrint(context); } */ import "C" import ( "runtime/cgo" "unsafe" ) //export MyGoPrint func MyGoPrint(context unsafe.Pointer) { h := *(*cgo.Handle)(context) val := h.Value().(string) println(val) h.Delete() } func main() { val := "hello Go" h := cgo.NewHandle(val) C.myprint(unsafe.Pointer(&h)) // Output: hello Go }.