खोज…


Cgo: पहला चरण ट्यूटोरियल

गो C बाइंडिंग के उपयोग के वर्कफ़्लो को समझने के लिए कुछ उदाहरण

क्या

गो में आप cgo का उपयोग करके C प्रोग्राम और फ़ंक्शंस को कॉल कर सकते हैं। इस तरह से आप आसानी से C API प्रदान करने वाले अन्य एप्लिकेशन या लाइब्रेरी में C बाइंडिंग बना सकते हैं।

किस तरह

आपको बस अपने सी प्रोग्राम को शामिल करने के बाद अपने गो कार्यक्रम की शुरुआत में एक import "C" जोड़ना है:

//#include <stdio.h>
import "C"

पिछले उदाहरण से आप गो में stdio पैकेज का उपयोग कर सकते हैं।

यदि आपको अपने समान फ़ोल्डर पर किसी एप्लिकेशन का उपयोग करने की आवश्यकता है, तो आप C की तुलना में समान सिंटैक्स का उपयोग करें ( " बजाय <> )"

//#include "hello.c"
import "C"

महत्वपूर्ण : import "C" स्टेटमेंट में include और import "C" बीच एक नई रेखा न छोड़ें या आपको इस प्रकार की त्रुटियां मिलेंगी:

# command-line-arguments
could not determine kind of name for C.Hello
could not determine kind of name for C.sum

उदाहरण

इस फ़ोल्डर पर आप C बाइंडिंग का एक उदाहरण पा सकते हैं। हमारे पास दो बहुत ही सरल सी "लाइब्रेरी" हैं जिन्हें hello.c कहा जाता है:

//hello.c
#include <stdio.h>

void Hello(){
    printf("Hello world\n");
}

यह बस कंसोल और sum.c में "हैलो वर्ल्ड" प्रिंट sum.c

//sum.c
#include <stdio.h>

int sum(int a, int b) {
    return a + b;
}

... जो 2 तर्क देता है और उसकी राशि लौटाता है (इसे प्रिंट नहीं करें)।

हमारे पास एक main.go प्रोग्राम है जो इस दो फाइलों का उपयोग करेगा। पहले हम उन्हें आयात करते हैं जैसा कि हमने पहले बताया था:

//main.go
package main

/*
  #include "hello.c"
  #include "sum.c"
*/
import "C"

नमस्ते दुनिया!

अब हम अपने गो ऐप में C प्रोग्राम्स का उपयोग करने के लिए तैयार हैं। आइए सबसे पहले हैलो प्रोग्राम को आजमाएँ:

//main.go
package main

/*
  #include "hello.c"
  #include "sum.c"
*/
import "C"


func main() {
    //Call to void function without params
    err := Hello()
    if err != nil {
        log.Fatal(err)
    }
}

//Hello is a C binding to the Hello World "C" program. As a Go user you could
//use now the Hello function transparently without knowing that it is calling
//a C function
func Hello() error {
    _, err := C.Hello()    //We ignore first result as it is a void function
    if err != nil {
        return errors.New("error calling Hello function: " + err.Error())
    }

    return nil
}

अब C प्रोग्राम का प्रिंट प्राप्त करने के लिए go run main.go का उपयोग करके main.go प्रोग्राम go run main.go : "हैलो वर्ल्ड!"। बहुत बढ़िया!

किलों का योग

आइए एक फ़ंक्शन को जोड़कर इसे और अधिक जटिल बनाते हैं जो इसके दो तर्कों को पूरा करता है।

//sum.c
#include <stdio.h>

int sum(int a, int b) {
  return a + b;
}

और हम इसे अपने पिछले गो ऐप से कॉल करेंगे।

//main.go
package main

/*
#include "hello.c"
#include "sum.c"
*/
import "C"

import (
    "errors"
    "fmt"
    "log"
)

func main() {
    //Call to void function without params
    err := Hello()
    if err != nil {
        log.Fatal(err)
    }

    //Call to int function with two params
    res, err := makeSum(5, 4)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("Sum of 5 + 4 is %d\n", res)
}

//Hello is a C binding to the Hello World "C" program. As a Go user you could
//use now the Hello function transparently without knowing that is calling a C
//function
func Hello() error {
    _, err := C.Hello() //We ignore first result as it is a void function
    if err != nil {
        return errors.New("error calling Hello function: " + err.Error())
    }

    return nil
}

//makeSum also is a C binding to make a sum. As before it returns a result and
//an error. Look that we had to pass the Int values to C.int values before using
//the function and cast the result back to a Go int value
func makeSum(a, b int) (int, error) {
    //Convert Go ints to C ints
    aC := C.int(a)
    bC := C.int(b)

    sum, err := C.sum(aC, bC)
    if err != nil {
        return 0, errors.New("error calling Sum function: " + err.Error())
    }

    //Convert C.int result to Go int
    res := int(sum)

    return res, nil
}

"मेकसम" फ़ंक्शन पर एक नज़र डालें। यह दो int पैरामीटर प्राप्त करता है जिन्हें C.int फ़ंक्शन का उपयोग करके C int परिवर्तित करने की C.int होती है। इसके अलावा, कॉल की वापसी हमें एक सी int देगी और कुछ गलत होने पर त्रुटि। हमें int() का उपयोग करके किसी Go के इंट के लिए C प्रतिक्रिया देने की आवश्यकता है।

go run main.go का उपयोग करके हमारे गो ऐप को go run main.go

$ go run main.go
Hello world!
Sum of 5 + 4 is 9

एक बाइनरी बनाना

यदि आप एक गो निर्माण का प्रयास करते हैं तो आपको कई परिभाषा त्रुटियाँ मिल सकती हैं।

$ go build
# github.com/sayden/c-bindings
/tmp/go-build329491076/github.com/sayden/c-bindings/_obj/hello.o: In function `Hello':
../../go/src/github.com/sayden/c-bindings/hello.c:5: multiple definition of `Hello'
/tmp/go-build329491076/github.com/sayden/c-bindings/_obj/main.cgo2.o:/home/mariocaster/go/src/github.com/sayden/c-bindings/hello.c:5: first defined here
/tmp/go-build329491076/github.com/sayden/c-bindings/_obj/sum.o: In function `sum':
../../go/src/github.com/sayden/c-bindings/sum.c:5: multiple definition of `sum`
/tmp/go-build329491076/github.com/sayden/c-bindings/_obj/main.cgo2.o:/home/mariocaster/go/src/github.com/sayden/c-bindings/sum.c:5: first defined here
collect2: error: ld returned 1 exit status

go build का उपयोग करते समय चाल को मुख्य फाइल को सीधे संदर्भित करना है:

$ go build main.go
$ ./main
Hello world!
Sum of 5 + 4 is 9

याद रखें कि -o फ्लैग go build -o my_c_binding main.go का उपयोग करके आप बाइनरी फ़ाइल को एक नाम प्रदान कर सकते हैं

मुझे आशा है कि आपको यह ट्यूटोरियल अच्छा लगा होगा।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow