我正在圍繞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一樣?
我想獎賞一個解決我的界面問題的答案,而不是專門針對FUSE。 – 2010-12-05 09:12:23