how about make char*
aadog opened this issue · comments
how about make char*
I don't understand what you means.
If you want a C constant string, you can use C"xxx" in Go+.
想把它作为go库使用
I think you want convert a Go string to a C style string?
Here is a way to do this:
import "github.com/goplus/libc"
import "reflect"
func CString(s string) *int8 {
sh := *(*reflect.StringHeader)(unsafe.Pointer(&s))
n := int32(sh.Len)
p := (*int8)(libc.Malloc(n+1))
libc.Memcpy(unsafe.Pointer(p), unsafe.Pointer(sh.Data), n)
p[n] = '\0'
return p
}
..额,意思是,libc不内置一下吗,
我做了好几个cgo-less的项目,似乎咱这个玩法有点问题,有时候会被莫名的gc掉
所以玩到最后估计项目问题有点大
..额,意思是,libc不内置一下吗, 我做了好几个cgo-less的项目,似乎咱这个玩法有点问题,有时候会被莫名的gc掉
这个我想过,可能最后需要 Go 的 gc 协作。协作规则也比较简单,我设想 c2go malloc 分配的内存在一个比较确定的虚拟地址空间范围内,这个范围内的 pointer 值都不参与 gc。这样可以用非常简单的方式避免与 gc 冲突,基本上对 go 的 gc 算法改动极少。
嗯,直接维护一个内存池比较理想,把堆仍进go里,不过有时候实现一些memcpy什么得如果不来自malloc得内存问题就很大,这个项目目测八九不离十会出大坑
还有个问题,有时候static 函数必须要cgo,这个玩意不太好处理,一般是syscall.newcallback
我觉得直接调用dll问题会少很多,llvm只重写头文件
我们做cgo-less的交互接口会方便很多
x* => uintptr
struct=>uintptr
int=>int32
然后加几个辅助函数
go.CStringToGo() string
go.GoStringToC()uintptr
多谢,这些都是很重要的经验。
当前 T* 和 void* 都是映射成 Go 的指针,不过我也在考虑改用 uintptr 这个方式。不过这些都只是实现变更,从 Go+ 的角度都不会改变使用方式。例如:
int chdir(char* dir);
这个函数现在被翻译成了:
func Chdir(dir *int8) int32
考虑到避免受 gc 的影响,它会被翻译成:
func Chdir(dir uintptr) int32
但是从 Go+ 的角度来说,还是会按 func Chdir(dir *int8) int32 这个原型来理解和使用这个函数。即:
ret := C.chdir(C"xxx")
Go+ 把这段代码翻译成 Go 的时候,会把 C"xxx" 转成 uintptr 传进去。
这样所有的 c2go 代码就都是不受 gc 影响了。
基于 dll 看似简单,实际上一点也不简单,会遇到其他方面的问题,比如 pthread 和 goroutine 打架的问题,那样用户使用的心智负担还是会比较大的。所以我的想法是 dll 不是不支持,但是一上来要先解决最难的部分。dll 支持只能受限支持,会在解决特定领域问题的时候,由领域专家来完成基于 dll 来包装成 Go+ 模块的工作,但是这个工作并不适合普通程序员来完成。
是的,如果要做这部分工作需要探讨可以联系我
我们做过几个典型这种模式下几个典型例子,你可以参考扫两眼
https://github.com/ying32/govcl
https://github.com/aadog/py3-go
线程打架问题一般直接锁定到主线程
cgo这玩意挺好玩,没有一个领头人,大哥你牵个头估计玩的人就都来了
是的,如果要做这部分工作需要探讨可以联系我 我们做过几个典型这种模式下几个典型例子,你可以参考扫两眼
https://github.com/ying32/govcl https://github.com/aadog/py3-go
你的微信?
qq 97077088