2010-11-29 66 views
5

我正在圍繞FUSE圍繞圍棋進行遊戲。不過,我一直堅持如何處理struct fuse_operations。我似乎無法通過聲明type Operations C.struct_fuse_operations來暴露操作結構,因爲成員都是小寫字母,我的pure-Go源代碼將不得不使用C-hackery來設置成員。在這種情況下,我的第一個錯誤是「無法設置getattr」,看起來像是默認拷貝構造函數的Go等價物。我的下一個嘗試是公開一個預期爲GetAttr,ReadLink等的接口,然後生成C.struct_fuse_operations並將函數指針綁定到調用給定接口的閉包。從圍繞FUSE開始

這是我有什麼(解釋繼續碼後):

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]: cannot use func literal (type func(*_Ctype_char, *_Ctype_struct_stat) int) as type *[0]uint8 in assignment

我不知道該怎麼傳遞給這些成員C.struct_fuse_operations,我已經在幾個地方看到過,從C代碼回到Go代碼是不可能的。

如果可能,我該怎麼辦?我如何提供接口函數的「默認」值,就好像相應的C.struct_fuse_operations成員設置爲NULL一樣?

+0

我想獎賞一個解決我的界面問題的答案,而不是專門針對FUSE。 – 2010-12-05 09:12:23

回答