나는 FUSE를 Go와 함께 배치하여 놀고 있습니다. 그러나 나는 struct fuse_operations
을 처리하는 방법에 집착했습니다. 멤버가 소문자이므로 type Operations C.struct_fuse_operations
을 선언하여 작업 구조체를 노출하는 것처럼 보이지 않을 수 있으며 내 순수 Go 소스는 C-hackery를 사용하여 어쨌든 멤버를 설정해야합니다. 이 경우 첫 번째 오류는 "getattr을 getattr을 설정할 수 없음"입니다. 기본 복사 생성자와 동일한 것으로 간주됩니다. 다음 시도는 GetAttr
, ReadLink
등의 인터페이스를 노출 한 다음 C.struct_fuse_operations
을 생성하고 지정된 인터페이스를 호출하는 클로저에 함수 포인터를 바인딩하는 것입니다.FUSE에서 Go Wrapping
fuse.go:21[fuse.cgo1.go:23]: cannot use func literal (type func(*_Ctype_char, *_Ctype_struct_stat) int) as type *[0]uint8 in assignment
나는 이러한 회원들에게 무엇을 전달할 확실하지 않다 : 이것은 다음과 같은 오류를 제공
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))
}
:
이
내가 (설명은 코드 다음에 계속)있어 무엇인가C.struct_fuse_operations
그리고 몇 군데 언급했는데 C에서 Go 코드로 다시 호출 할 수 없습니다.
가능한 경우 어떻게해야합니까? 마치 해당 C.struct_fuse_operations
구성원이 NULL로 설정된 것처럼 작동하는 인터페이스 함수에 대한 "기본"값을 제공 할 수 있습니까?
FUSE가 아닌 인터페이스 관련 문제를 해결할 수있는 현상금을 수여하고 싶습니다. –