गो

2010-11-29 14 views
5

से Wrapping FUSE मैं गो के साथ FUSE लपेटने के साथ खेल रहा हूं। हालांकि मैं struct fuse_operations से निपटने के तरीके से अटक गया हूं। मैं type Operations C.struct_fuse_operations घोषित करके ऑपरेशन स्ट्रक्चर का खुलासा नहीं कर सकता क्योंकि सदस्य कम मामले हैं, और मेरे शुद्ध-गो स्रोतों को सदस्यों को सेट करने के लिए सी-हैकरी का उपयोग करना होगा। इस मामले में मेरी पहली त्रुटि एक डिफ़ॉल्ट प्रतिलिपि कन्स्ट्रक्टर के गो समकक्ष होने के लिए "गेटैटर सेट नहीं कर सकती" है। मेरा अगला प्रयास GetAttr, ReadLink आदि की अपेक्षा रखने वाले इंटरफ़ेस का खुलासा करना है, और उसके बाद C.struct_fuse_operations उत्पन्न करें और फ़ंक्शन पॉइंटर्स को बंद करने वाले इंटरफ़ेस को बंद करने के लिए बाध्य करें।गो

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.struct_fuse_operations सदस्य को पूर्ण पर सेट किया गया है?

+0

मैं अपने उत्तरदायी चिंताओं को संबोधित करने वाले उत्तर में बक्षीस देना चाहता हूं, विशेष रूप से FUSE के लिए नहीं। –

उत्तर

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 समस्या का वर्णन करता है।

मुझे संदेह है कि यदि आप फ़ंक्शन पॉइंटर्स को यूंटप्टर के अलावा कुछ भी संभालना चाहते हैं, तो आपको कोगो पर हैक करना होगा।

 संबंधित मुद्दे