我试过了:
fmt.Printf("%d",math.MaxUint64)
但是我收到以下错误消息:
常数18446744073709551615溢出int
我怎样才能解决这个问题?谢谢!
哎呀,当我做出这个答案时,有一件事我忘记了,而且我对自己并不是很确定,而且我似乎无法在MSDN和谷歌以及Stack Overflow搜索中找到相关信息.
Windows API中有许多地方使用负数,或者数字太大而无法使用有符号整数; 例如CW_USEDEFAULT,INVALID_HANDLE_VALUE,GWLP_USERDATA,等等.在C的世界里,一切都很好,花花公子:语言的整数提升规则得到了拯救.
但在Go中,我必须将所有参数传递给函数uintptr(相当于C的uintptr_t).函数的返回值也以这种方式返回,然后我需要进行比较.Go不允许整数提升,并且它不允许您在编译时将有符号常量表达式转换为无符号表达式.
现在,我在我的UI库中设置了一些用于处理这些常量的jerry-rig.(这是这个解决方案在行动中的样子.)但是,我对这个解决方案并不满意; 我觉得它喜欢ABI的事情,我想要完全确定我在做什么.
所以我的问题是:将签名值传递给Windows API函数时如何处理?返回时如何处理?
我的所有常量都是自动生成的(示例输出).自动生成器使用C ffi,我宁愿不用于主项目,因为我可以直接调用DLL(这也使得交叉编译至少在今年剩余时间内更容易).如果我可以以某种方式利用它,例如通过将所有内容都变成表单的C端变量
uintptr_t x_CONST_NAME = (uintptr_t) (CONST_NAME);
Run Code Online (Sandbox Code Playgroud)
这会有所帮助.但如果没有这个答案我就不能这样做.
谢谢!
IRC上的某个人将其改为不同(重新格式化以避免水平滚动):
[19:13] <FraGag> basically, you're asking whether an int with a value of -1
will be returned as 0x00000000FFFFFFFF or as 0xFFFFFFFFFFFFFFFF
if an int is 4 bytes and an uintptr is 8 bytes
Run Code Online (Sandbox Code Playgroud)
基本上这个,但专门用于Windows API互操作,传入的参数,无论uintptr大小.
我已经阅读了关于“ https://github.com/golang/go/issues/25484 ”关于从[]byteto 的无复制转换string。
我想知道是否有办法将字符串转换为没有内存复制的字节片?
我正在编写一个处理 terra 字节数据的程序,如果每个字符串在内存中复制两次,则会减慢进度。而且我不关心可变/不安全,只关心内部使用,我只需要尽可能快的速度。
例子:
var s string
// some processing on s, for some reasons, I must use string here
// ...
// then output to a writer
gzipWriter.Write([]byte(s)) // !!! Here I want to avoid the memory copy, no WriteString
Run Code Online (Sandbox Code Playgroud)
所以问题是:有没有办法防止内存复制?我知道也许我需要 unsafe 包,但我不知道如何。我已经搜索了一段时间,直到现在还没有答案,SO 也没有显示相关的答案有效。
就像在 Java 中一样,我们将变量初始化为最小值/最大值,
Integer.MIN_VALUE and Integer.MAX_VALUE
Run Code Online (Sandbox Code Playgroud)
Go有什么办法吗?