수색…
이동에서 C 함수 호출
Cgo는 C 코드를 호출하는 Go 패키지의 생성을 가능하게합니다.
cgo
를 사용하려면 의사 패키지 "C"를 가져 오는 일반 Go 코드를 작성하십시오. Go 코드는 C.int
와 같은 유형 또는 C.Add
와 같은 함수를 참조 할 수 있습니다.
"C"가져 오기는 주석 바로 앞에 오며, Preamble이라는 주석은 패키지의 C 부분을 컴파일 할 때 헤더로 사용됩니다.
cgo
주석과 import 문 사이에는 빈 줄이 없어야합니다.
import "C"
는 다른 가져 오기와 함께 괄호로 묶인 "인수"가져 오기 문으로 그룹화 될 수 없습니다. 다음과 같이 여러 import 문을 작성해야합니다.
import "C"
import "fmt"
그리고 다음과 같이 다른 가져 오기에 대해 인수로 된 import 문을 사용하는 것이 좋습니다.
import "C"
import (
"fmt"
"math"
)
cgo
를 사용한 간단한 예제 :
package main
//int Add(int a, int b){
// return a+b;
//}
import "C"
import "fmt"
func main() {
a := C.int(10)
b := C.int(20)
c := C.Add(a, b)
fmt.Println(c) // 30
}
그런 다음 go build
를 실행하고 실행하십시오.
30
cgo
패키지를 빌드하려면 go build
사용하거나 평소와 같이 go install
. go tool
는 특수 "C"
가져 오기를 인식하고 해당 파일에 대해 자동으로 cgo
를 사용합니다.
모든 방향으로 C 및 Go 코드 연결
Go에서 C 코드 호출하기
package main
/*
// Everything in comments above the import "C" is C code and will be compiles with the GCC.
// Make sure you have a GCC installed.
int addInC(int a, int b) {
return a + b;
}
*/
import "C"
import "fmt"
func main() {
a := 3
b := 5
c := C.addInC(C.int(a), C.int(b))
fmt.Println("Add in C:", a, "+", b, "=", int(c))
}
C에서 Go 코드 호출하기
package main
/*
static inline int multiplyInGo(int a, int b) {
return go_multiply(a, b);
}
*/
import "C"
import (
"fmt"
)
func main() {
a := 3
b := 5
c := C.multiplyInGo(C.int(a), C.int(b))
fmt.Println("multiplyInGo:", a, "*", b, "=", int(c))
}
//export go_multiply
func go_multiply(a C.int, b C.int) C.int {
return a * b
}
함수 포인터 다루기
package main
/*
int go_multiply(int a, int b);
typedef int (*multiply_f)(int a, int b);
multiply_f multiply;
static inline init() {
multiply = go_multiply;
}
static inline int multiplyWithFp(int a, int b) {
return multiply(a, b);
}
*/
import "C"
import (
"fmt"
)
func main() {
a := 3
b := 5
C.init(); // OR:
C.multiply = C.multiply_f(go_multiply);
c := C.multiplyWithFp(C.int(a), C.int(b))
fmt.Println("multiplyInGo:", a, "+", b, "=", int(c))
}
//export go_multiply
func go_multiply(a C.int, b C.int) C.int {
return a * b
}
유형 변환, 구조체 및 포인터 산술 액세스
공식 Go 문서에서 :
// Go string to C string
// The C string is allocated in the C heap using malloc.
// It is the caller's responsibility to arrange for it to be
// freed, such as by calling C.free (be sure to include stdlib.h
// if C.free is needed).
func C.CString(string) *C.char
// Go []byte slice to C array
// The C array is allocated in the C heap using malloc.
// It is the caller's responsibility to arrange for it to be
// freed, such as by calling C.free (be sure to include stdlib.h
// if C.free is needed).
func C.CBytes([]byte) unsafe.Pointer
// C string to Go string
func C.GoString(*C.char) string
// C data with explicit length to Go string
func C.GoStringN(*C.char, C.int) string
// C data with explicit length to Go []byte
func C.GoBytes(unsafe.Pointer, C.int) []byte
이것을 어떻게 사용 하는가:
func go_handleData(data *C.uint8_t, length C.uint8_t) []byte {
return C.GoBytes(unsafe.Pointer(data), C.int(length))
}
// ...
goByteSlice := []byte {1, 2, 3}
goUnsafePointer := C.CBytes(goByteSlice)
cPointer := (*C.uint8_t)(goUnsafePointer)
// ...
func getPayload(packet *C.packet_t) []byte {
dataPtr := unsafe.Pointer(packet.data)
// Lets assume a 2 byte header before the payload.
payload := C.GoBytes(unsafe.Pointer(uintptr(dataPtr)+2), C.int(packet.dataLength-2))
return payload
}
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow