Say here is a C api like `ssize_t writev(const struct iovec *iov, int iovcnt)` which the definition of iovec is like below:
``` struct iovec { uint8_t *Base; /* Base address. */ uint64_t Len; /* Length. */ }; ``` For C api which like `ssize_t write(const void *buf, size_t nbyte)`, the solution would be quite straight forward: ``` bs := make([]byte, 1024*1024*512) // without extra memory allocation and copying of the whole input byte slice :-D rc := C.write(unsafe.Pointer(&bs[0]), C.int(len(bs))) ``` But how to call C `writev` style API without extra memory allocation or copying of the whole byte slice vector? ``` bsv := make([][]byte, 1024) for i := range bsv{ bsv[i] = make([]byte, 5*1024*(rand.Intn(i)+1)) } // assuming that allocation of a iovec array is acceptable // but allocation and copying of all bsv[x] byte slice member is unacceptable // iovec := make([]syscall.Iovec, len(bsv)) for i := range bsv { bs := bsv[i] if len(bs) > 0 { iovec[i].Base = unsafe.Pointer(&bs[0]) iovec[i].Len = uint64(len(bs)) } } // // rc := C.writev( /* how? :-( */) rc := C.writev(unsafe.Pointer(&iovec[0]), C.int(len(iovec))) // Does this code is right and safe? ``` Does the code above is right? I have read cgo's docs carefully, and here is a constraint from https://golang.org/cmd/cgo/#hdr-Passing_pointers: > Go code may pass a Go pointer to C provided the Go memory to which it points does not contain any Go pointers. If the Go memory pointed by `unsafe.Pointer(&iovec[0])` contains pointer which points to these byte slice members of bsv, so it would be a *violation* of the cgo constraint above. And that means you could not call C `writev` style API without allocation and copying of the whole vector. Please correct me if I get something wrong. Thanks a lot :-D -- 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. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/1638feb7-3f3d-4061-ad70-a031839b7542n%40googlegroups.com.