C, 파이톤에서 Go를 불러오세요.
이 글은 이 기능의 기본적인 사용 방법을 설명할 것이다.
Go
Source Code
main.go
package main
import "C"
import "fmt"
//export foo
func foo(name *C.char) *C.char {
nameString := C.GoString(name)
result := fmt.Sprintf("Hello, %s!", nameString)
return C.CString(result)
}
func main() {}
프로그램 라이브러리의 주체가 되는 코드.C 패키지에 대한 import을 통해 cgo의 다양한 함수 형식을 호출할 수 있습니다.
export
공유 라이브러리에서 디렉터리에 표시된 export 함수를 사용할 수 있습니다.매개 변수와 되돌아오는 값을
*C.char
로 설정합니다. 이것은 string
공유 라이브러리에서 사용되는 GoString
유형이기 때문입니다.Gostring은
struct { const char *p; ptrdiff_t n; }
형식으로 헤더 파일을 읽을 수 없는 프로그래밍 언어 (예: Python) 는 _fields_: List[Tuple]
구성원이 있는 클래스를 argtypes
로 지정하거나 rettype
등 약간의 처리 번거로움으로 인해 중단됩니다.앞으로 시간이 있을 때 부기된 일에 대해 설명할 수도 있습니다.
Build
go build -buildmode=c-shared -o main.so main.go
교차 번역의 경우CGO_ENABLED
는 0
가 되기 때문에 환경 변수를 전달해야 한다.C
Source Code
main.c
#include <stdio.h>
#include "main.h"
int main() {
char* result = foo("mopeneko");
puts(result);
}
라이브러리를 구축할 때include에서 생성된 main.h
를 통해 Go가 생성한 형식이나 export 함수를 호출할 수 있습니다.string
를 사용하는 경우 main.h
에 기술된 구조 정의에 따라 액세스해야 합니다.Build
cc -o main main.c main.so
방금 구축된 main.so
를 컴파일러에 전달하여 컴파일합니다.Execute
$ ./main
Hello, mopeneko!
Python
Source Code
main.py
from ctypes import CDLL, c_char_p
lib = CDLL("./main.so")
foo = lib.foo
foo.restype = c_char_p
print(foo(b"mopeneko").decode("utf-8"))
restype
는 기본값ctypes.c_int
이므로 반환값에 따라 지정해야 합니다.매개 변수와 반환값
char*
은bytes형과 대체적으로 같기 때문에 b""
또는str.decode()
을 사용하여 적당한 유형 전환을 해야 한다.위에서 말한 바와 같이
string
가 매개 변수나 되돌아오는 값이라면 argtypes
또는 rettype
에서 클래스를 지정해야 한다.Execute
$ python main.py
Hello, mopeneko!
Reference
이 문제에 관하여(C, 파이톤에서 Go를 불러오세요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/mopeneko/articles/dc294e1e95d11e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)