xjjrocker

第 6397 号会员 /

回复了 xjjrocker 创建的主题: go调用c++的Dll,dll里面需要的float参数,go应该怎样传值进去呢?

发了帖子就自己摸索出了解决方案,也好,发出来,大家遇到了可以就帮得上了。解决方案如下:

//uintptr是golang的内置类型,是能存储指针的整型
//因此float32必须先转换成指针类型整形
func Float32bits(f float32) uint32 {
// fmt.Println(reflect.TypeOf(unsafe.Pointer(&f))) //unsafe.Pointer
// fmt.Println(reflect.TypeOf((*uint32)(unsafe.Pointer(&f))))//*uint32
  return *(*uint32)(unsafe.Pointer(&f))
}

回复了 sax1412 创建的主题: jinzhu/gorm 这个包 请问怎么处理复杂的sql语句呢

用过beego的orm很好用
尝试过xorm也还不错
但看到gorm那么多star我以为很好用,但实际上很怀疑那么多的star和fork是怎么产生的,批量删除的逻辑很反人类,一个批量查询的删除,竟然直接删除整个表的数据,而不是查询条件出来的数据。反馈了这个问题还直接关闭,说不支持,哈哈。
好神奇的思路。
目前来看就推荐前两者。

回复了 xjjrocker 创建的主题: char* Zqdm[]如何更改成golang的入参呢

自己来把解决思路放上来,给后来者参考吧:

//C
myfunc(byte Market[], char* Zqdm[], short& Count)

这个函数用golang重新定义

//go
func myfunc(Market []byte, Zqdm []string, Count int) bool {
    ...
}

难点也是重点的是,原来的char* Zqdm[]虽然在go里面用了Zqdm []string,但不代表这样就可以了,其实应注意原来的数组是指针数组,所以我们变成字符串数组后,但真正的调用的地方这个字符串数组要转成指针数组([] *byte)。

回复了 cjh6393 创建的主题: Cgo编程c语言指针的问题

你这个问题是c和go的类型对应关系问题,你一个小片段,任谁也说不了答案呢;至于解决方式,那就更不知道怎么回复啊,不明确的问题,太宽泛。
以下供参考:go和c之间的类型转换

char -->  C.char -->  byte
signed char -->  C.schar -->  int8
unsigned char -->  C.uchar -->  uint8
short int -->  C.short -->  int16
short unsigned int -->  C.ushort -->  uint16
int -->  C.int -->  int
unsigned int -->  C.uint -->  uint32
long int -->  C.long -->  int32 or int64
long unsigned int -->  C.ulong -->  uint32 or uint64
long long int -->  C.longlong -->  int64
long long unsigned int -->  C.ulonglong -->  uint64
float -->  C.float -->  float32
double -->  C.double -->  float64
wchar_t -->  C.wchar_t  -->  
void * -> unsafe.Pointer

另外需注意 c的char* [],在go就是[] *byte

回复了 xjjrocker 创建的主题: java的连接wss的websocket服务器代码如何转成go代码

自己解决了,主要是网上找来找去都没有go作为websocket的client去连接wss服务器的,这里给出解决方案,以供后来人借鉴。

import (
    "crypto/tls"
    "github.com/gorilla/websocket"
)

func main() {
url := "wss://xxx.xxx.xxx.xxx:8088"
config := tls.Config{InsecureSkipVerify: true}
websocket.DefaultDialer.TLSClientConfig = &config
conn, _, err := websocket.DefaultDialer.Dial(url, nil)
if err != nil {
    fmt.Printf("err=" + err.Error())
}
defer conn.Close()
fmt.Println("connect ", url, " success")
}

回复了 xjjrocker 创建的主题: char* Zqdm[]如何更改成golang的入参呢

报错如下
@jimmykuu

Exception 0xc0000005 0x0 0x2 0x57755daa
PC=0x57755daa

syscall.Syscall6(0x577529c0, 0x5, 0x116c4490, 0x116c44a0, 0x116c446c, 0x11822000, 0x117c8200, 0x0, 0x0, 0x40af9f, ...)
        C:/Go/src/runtime/syscall_windows.go:174 +0x51
syscall.(*Proc).Call(0x116c44c0, 0x116a4b40, 0x5, 0x5, 0x100, 0x100, 0x116c43ec, 0x0)
        C:/Go/src/syscall/dll_windows.go:155 +0x4ae
main.Hq_GetSecurityQuotes(0x116c4468, 0x2, 0x2, 0x116c4480, 0x2, 0x2, 0x2)
        C:/mygo/testTdxHq/testdll.go:367 +0x1d1
main.main()
        C:/mygo/testTdxHq/testdll.go:40 +0xc2
eax     0x1
ebx     0x116c4444
ecx     0x3197c226
edx     0x2
edi     0x116c446c
esi     0x3197c208
ebp     0x8fe54
esp     0x8f8b0
eip     0x57755daa
eflags  0x10297
cs      0x1b
fs      0x3b
gs      0x0
exit status 2

回复了 xjjrocker 创建的主题: char* Zqdm[]如何更改成golang的入参呢

char xMarket[] = {0,1, 0, 1 };
const char* Zqdm[] = { "000001", "600030", "000002", "601288" };
short ZqdmCount = 4;
bool1 = TdxHq_GetSecurityQuotes(xMarket, Zqdm, &ZqdmCount, Result, ErrInfo);

这段代码我用go实现如下

arrmarket := [2]byte{1,0}
arrzqdm := [2]string{"601166","000001"}
Hq_GetSecurityQuotes(arrmarket, arrzqdm, 2)

其中函数实现如下
func Hq_GetSecurityQuotes(Market [2]byte, Zqdm [2]string, Count int) {
...//省略
ret, _, err := Hq_GetSecurityQuotes.Call(uintptr(unsafe.Pointer(&Market)),
        uintptr(unsafe.Pointer(&Zqdm)), uintptr(unsafe.Pointer(&zqdmCount)),
        uintptr(unsafe.Pointer(&Result[0])), uintptr(unsafe.Pointer(&ErrInfo[0])))
...//省略
}

我发现传入参数只有一条有效,明明两条,但似乎只传入了一条,因为返回也只有一条数据,这里用&Market难道不对,请大侠指点。

回复了 xjjrocker 创建的主题: char* Zqdm[]如何更改成golang的入参呢

发现golang中,数组作为参数传递时, 需要被检查长度(或许有时候不报错,但必须带长度),如下方式比如 fun test_array(args [4]int){….}
数字4必须带上。

回复了 playrome 创建的主题: SysCall调用外部函数,提示fatal: morestack on g0的错误

问题解决了没啊,我也遇到了!
同一段代码,在win7的32位系统下,编译运行一切正常。回到家里win10的64位系统,装了32的go,run代码则直接报fatal: morestack on g0;
如果是用64位go直接说Failed to load xxx.dll: %1 is not a valid Win32 application