2010-11-29 6 views
5
에서

나는 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로 설정된 것처럼 작동하는 인터페이스 함수에 대한 "기본"값을 제공 할 수 있습니까?

+0

FUSE가 아닌 인터페이스 관련 문제를 해결할 수있는 현상금을 수여하고 싶습니다. –

답변