On Tue, Apr 11, 2017 at 2:25 AM, hui zhang <fastfad...@gmail.com> wrote:
>
> If I define the same  2 struct in c and go
> can they be  passed directly with unsafe.Pointer

The struct layout rules are under-defined in Go.  The current rules
are straightforward, and it is the case that most structs with the
same sequence of field types will look the same in C and Go.  Of
course you must remember that `int` in Go is often not the same size
as `int` in C.  Also the alignment rules are not always the same, so
don't permit any alignment padding.  And this may change in future Go
releases.

> and how to export go struct from go to c ?

You can't, not easily.  But it's easy to use cgo to export a C struct
from C to Go, and doing that avoids all the concerns about types and
alignments, so you should do that if at all possible.


> /*
> #include <stdio.h>
>
> typedef struct {
>     int a;
>     int b;
> } Foo;
>
> void pass_struct(Foo *in) { printf("%d : %d\n", in->a, in->b); }
>
> */
>
> import "C"
>
> import (
>     "fmt"
>     "unsafe"
> )
>
> type Foo struct{ a, b int32 }
>
> C.pass_struct((*C.Foo)(unsafe.Pointer(&foo)))

For example, how about `type Foo C.Foo`?

Ian

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to