草庐IT

从 go 调用 C 函数

我对学习go语言很陌生,我开始成为这个语言的super爱好者语。我希望,我很快就会成为一名优秀的地鼠。目前我尝试调用C函数读取影子文件,我的代码是://#cgoCFLAGS:-D_POSIX_SOURCE=1//#include//#include//size_tsize_of_shadow(){returnsizeof(structspwd);}import"C"import"unsafe"import"fmt"typeShadowstruct{NamestringPasswdstring}funcGetspnam(namestring)(*Shadow,error){cname:=

go - 在 Go 中什么时候仅通过 `uintptr` 引用对象是安全的?

Go编程语言在第13.2节中说这是代码是安全的并且x将始终对垃圾收集器可见:pb:=(*int16)(unsafe.Pointer(uintptr(unsafe.Pointer(&x))+unsafe.Offsetof(x.b)))*pb=42并且这段代码是不安全的,因为x暂时对垃圾收集器,它可以移动它,使pb成为悬空指针:tmp:=uintptr(unsafe.Pointer(&x))+unsafe.Offsetof(x.b)pb:=(*int16)(unsafe.Pointer(tmp))*pb=42但我看不出这两个例子之间的区别。在描述为安全的情况下,在uintptr被调用之后,

go - 在 Go 中什么时候仅通过 `uintptr` 引用对象是安全的?

Go编程语言在第13.2节中说这是代码是安全的并且x将始终对垃圾收集器可见:pb:=(*int16)(unsafe.Pointer(uintptr(unsafe.Pointer(&x))+unsafe.Offsetof(x.b)))*pb=42并且这段代码是不安全的,因为x暂时对垃圾收集器,它可以移动它,使pb成为悬空指针:tmp:=uintptr(unsafe.Pointer(&x))+unsafe.Offsetof(x.b)pb:=(*int16)(unsafe.Pointer(tmp))*pb=42但我看不出这两个例子之间的区别。在描述为安全的情况下,在uintptr被调用之后,

c - (*C.uchar)(&buffer[0]) 与 (*C.uchar)(unsafe.Pointer(&buffer[0]))

我们在这里讨论了使用(或不使用)unsafe.Pointer将指向字节数组的指针从Go传递到C。(不)使用unsafe.Pointer()的最大原因是什么?我会把一致性作为一个原因,因为你会调用一个“外部”函数,即使是在不同的语言中,你也想保证它是一个指针类型。但是,由于Go语言风格看起来有点像C,使用(*C.uchar)(&buffer[0]))的直接转换是有效的和有效。它有效的事实并不能使我确信它比使用unsafe.Pointer()更安全。也许我对看起来像函数调用的Go转换感到有点困惑/冲突,Pointer被定义为typePointer*ArbitraryType实际上说(*Ar

c - (*C.uchar)(&buffer[0]) 与 (*C.uchar)(unsafe.Pointer(&buffer[0]))

我们在这里讨论了使用(或不使用)unsafe.Pointer将指向字节数组的指针从Go传递到C。(不)使用unsafe.Pointer()的最大原因是什么?我会把一致性作为一个原因,因为你会调用一个“外部”函数,即使是在不同的语言中,你也想保证它是一个指针类型。但是,由于Go语言风格看起来有点像C,使用(*C.uchar)(&buffer[0]))的直接转换是有效的和有效。它有效的事实并不能使我确信它比使用unsafe.Pointer()更安全。也许我对看起来像函数调用的Go转换感到有点困惑/冲突,Pointer被定义为typePointer*ArbitraryType实际上说(*Ar

go - 使用 unsafe 将 []byte 转换为字符串时, 'capacity' 内存会发生什么变化?

我看到人们使用unsafe.Pointer有效地将[]byte转换为string。https://play.golang.org/p/uz84H54VM8varb=[]byte{'f','o','o','b','a','r'}vars=*(*string)(unsafe.Pointer(&b))我了解它的作用以及一般涉及的危险,但对内存有疑问。因为slice的结构有一个数据指针、一个长度和一个容量,但是字符串没有容量,如果b是在堆上创建的,那block内存会发生什么?垃圾收集器是否知道它需要单独跟踪容量?或者这会导致内存泄漏吗?编辑:我了解如何对字符串和slice进行重新slice。上

go - 使用 unsafe 将 []byte 转换为字符串时, 'capacity' 内存会发生什么变化?

我看到人们使用unsafe.Pointer有效地将[]byte转换为string。https://play.golang.org/p/uz84H54VM8varb=[]byte{'f','o','o','b','a','r'}vars=*(*string)(unsafe.Pointer(&b))我了解它的作用以及一般涉及的危险,但对内存有疑问。因为slice的结构有一个数据指针、一个长度和一个容量,但是字符串没有容量,如果b是在堆上创建的,那block内存会发生什么?垃圾收集器是否知道它需要单独跟踪容量?或者这会导致内存泄漏吗?编辑:我了解如何对字符串和slice进行重新slice。上

c - 强制定义 Go 结构以将 unsafe.Pointer() 转换为 C 结构

与C代码互操作时,我无法直接转换结构,我被迫在Go中定义一个等效的结构。libproc.h中的C函数是intproc_pidinfo(intpid,intflavor,uint64_targ,void*buffer,intbuffersize)flavor==PROC_PIDTASKINFO的C结构是proc_taskinfo,定义在sys/proc_info.h中(包含在libproc中)。h):structproc_taskinfo{uint64_tpti_virtual_size;/*virtualmemorysize(bytes)*/uint64_tpti_resident_s

c - 强制定义 Go 结构以将 unsafe.Pointer() 转换为 C 结构

与C代码互操作时,我无法直接转换结构,我被迫在Go中定义一个等效的结构。libproc.h中的C函数是intproc_pidinfo(intpid,intflavor,uint64_targ,void*buffer,intbuffersize)flavor==PROC_PIDTASKINFO的C结构是proc_taskinfo,定义在sys/proc_info.h中(包含在libproc中)。h):structproc_taskinfo{uint64_tpti_virtual_size;/*virtualmemorysize(bytes)*/uint64_tpti_resident_s

go - 在 Go 中检查字节序的任何更好的方法

我正在编写一个小程序来使用Go检查字节序:variint=0x0100ptr:=unsafe.Pointer(&i)if0x01==*(*byte)(ptr){fmt.Println("BigEndian")}elseif0x00==*(*byte)(ptr){fmt.Println("LittleEndian")}else{//...}我导入“不安全”包以将*int转换为*byte。但正如https://golang.org/pkg/unsafe/中提到的:PackageunsafecontainsoperationsthatsteparoundthetypesafetyofGopr