Я пытаюсь скопировать содержимое структуры в Go
type test struct {
a string
b string
}
к структуре С.
typedef struct {
char a[10];
char b[75];
}test_c;
Мое требование не позволяет мне изменять структуру типов членов как Go, так и C. Я написал следующий код, чтобы скопировать структуру Go в структуру C, и я тоже могу их скопировать.
cmain.h
typedef struct {
char a[10];
char b[75];
}test_c;
void cmain(test_c* value);
cmain.c
#include <stdio.h>
#include "cmain.h"
#include "_cgo_export.h"
void cmain(test_c *value) {
printf("Inside C code\n");
printf("C code structure Member:a=%s\n", value->a);
printf("C code structure Member:b=%s\n", value->b);
}
go_func.go
package main
import (
/*
#include "cmain.h"
*/
"C"
"fmt"
"unsafe"
)
type test struct {
a string
b string
}
func main() {
var p_go test
var p_c C.test_c
p_go.a = "ABCDEFGHIJ"
p_go.b = "QRSTUVXWYZ"
fmt.Println(unsafe.Sizeof(p_c.a))
StructMemberCopy(&p_c.a, p_go.a)
fmt.Println("In GO code\n")
fmt.Println("GO code structure Member:a=%s", p_go.a)
fmt.Println("GO code structure Member:b=%s", p_go.b)
fmt.Println("Call C function by passing GO structure\n")
C.cmain((*C.test_c)(unsafe.Pointer(&p_c)))
}
func StructMemberCopy(dest *[10]C.char, src string) {
for i, _ := range src {
dest[i] = C.char(src[i])
fmt.Printf("%d %c \n", i, src[i])
}
}
Здесь я пытаюсь написать обобщенную функцию для копирования содержимого члена структуры Go в структуру C.
func StructMemberCopy(dest *[10]C.char, src string) {
for i, _ := range src {
dest[i] = C.char(src[i])
fmt.Printf("%d %c \n", i, src[i])
}
}
В приведенном выше коде, когда я вызываю функцию StructMemberCopy(&p_c.a, p_go.a) с &p_c.a в качестве аргумента, код компилируется без ошибок, но когда я отправляю &p_c.b, он выдает ошибку
cannot use &p_c.b (type *[75]C.char) as type *[10]C.char in argument to StructMemberCopy
Может ли кто-нибудь дать некоторые сведения о том, как написать обобщенный аргумент для func StructMemberCopy, поскольку размер члена массива C Structure может варьироваться. Это может стать
typedef struct {
char a[10];
char b[75];
}test_c;
or typedef struct {
char a[15];
char b[40];
}test_c;
C.char
. Вам нужно сделать это по байтам. - person JimB   schedule 21.11.2017