TIL :) I should take a look at that, it's a clever way to solve the problem
:)

On Tue, Apr 11, 2017 at 10:02 PM, Ian Lance Taylor <i...@golang.org> wrote:

> On Tue, Apr 11, 2017 at 10:29 AM, Axel Wagner
> <axel.wagner...@googlemail.com> wrote:
> >
> > This begs the question how syscalls are handled. I assume they don't use
> > cgo, but often they require to pass a pointer to some memory which is
> > documented as a C-struct. Is there any guidance on that (or any problems
> > that might arise there)?
>
> ObPedant: it *raises* the question, it doesn't *beg* the question.
>
> The syscall package (and the golang.org/x/sys/unix package) defines Go
> versions of a number of C structs used by system calls.  Those Go
> versions are generated by cgo (run in a special mode, and with the
> generated files committed to the repository) and are accurate Go
> representations of the C structs.
>
> Ian
>
> > On Tue, Apr 11, 2017 at 6:41 PM, Ian Lance Taylor <i...@golang.org>
> wrote:
> >>
> >> 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.
> >
> >
>

-- 
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