5

FUSE を Go でラッピングして遊んでいます。しかし、私は対処方法に行き詰まっていますstruct fuse_operationstype Operations C.struct_fuse_operationsメンバーが小文字であるため、宣言することによって操作構造体を公開することはできないようです。私の純粋な Go ソースは、とにかくメンバーを設定するために C-hackery を使用する必要があります。この場合の最初のエラーは、デフォルトのコピー コンストラクターに相当するように見える "getattr を設定できません" です。私の次の試みはGetAttrReadLinkなどを期待するインターフェイスを公開しC.struct_fuse_operations、関数ポインターを生成して、指定されたインターフェイスを呼び出すクロージャーにバインドすることです。

これは私が持っているものです(コードの後に​​説明が続きます):

package fuse

// #include <fuse.h>
// #include <stdlib.h>
import "C"

import (
    //"fmt"
    "os"
    "unsafe"
)

type Operations interface {
    GetAttr(string, *os.FileInfo) int
}

func Main(args []string, ops Operations) int {
    argv := make([]*C.char, len(args) + 1)
    for i, s := range args {
        p := C.CString(s)
        defer C.free(unsafe.Pointer(p))
        argv[i] = p
    }
    cop := new(C.struct_fuse_operations)
    cop.getattr = func(*C.char, *C.struct_stat) int {}
    argc := C.int(len(args))
    return int(C.fuse_main_real(argc, &argv[0], cop, C.size_t(unsafe.Sizeof(cop)), nil))
}

package main

import (
    "fmt"
 "fuse"
    "os"
)

type CpfsOps struct {
    a int
}

func (me *CpfsOps) GetAttr(string, *os.FileInfo) int {
    return -1;
}

func main() {
    fmt.Println(os.Args)
    ops := &CpfsOps{}
    fmt.Println("fuse main returned", fuse.Main(os.Args, ops))
}

これにより、次のエラーが発生します。

fuse.go:21[fuse.cgo1.go:23]: func リテラル (型 func(*_Ctype_char, *_Ctype_struct_stat) int) を代入で型 *[0]uint8 として使用できません

のこれらのメンバーに何を渡せばよいかわかりませんC.struct_fuse_operations。いくつかの場所で、C から Go コードに戻すことはできないという言及を見てきました。

可能であれば、どうすればよいですか?C.struct_fuse_operations対応するメンバーが NULL に設定されているかのように機能するインターフェイス関数の "既定" 値を指定するにはどうすればよいですか?

4

1 に答える 1

1

http://cheesesun.blogspot.com/2010/04/callbacks-in-cgo.htmlは、一般的な(多少複雑な場合でも)手法について説明しています。http://groups.google.com/group/golang-nuts/browse_thread/thread/abd0e30dafdbf297?tvc=2&pli=1で問題が説明されています。

関数ポインタをuintptrs以外のものとして扱いたい場合は、cgoをハックする必要があると思います。

于 2010-12-07T10:53:53.917 に答える