在C++中,我可以使用memset初始化一个带有一些值的数组:
const int MAX = 1000000;
int is_prime[MAX]
memset(is_prime, 1, sizeof(is_prime))
Run Code Online (Sandbox Code Playgroud)
什么memset做的,粗略地可以被描述为填充数组有一些价值,但这样做真的非常快.
我可以这样做is_prime := make([]int, 1000000),但这将创建一个全0的切片,以我可以使用的类似方式new([1000000]int),但没有任何东西可以让我创建一个包含所有1或任何其他非零元素的数组/切片.
当然我可以使用循环用稍后的值填充它,但主要目的memset是它比循环更快.
那么Go程序员是否有memset模拟(将数组初始化为某些非零值的快速方法)?
在Dave Cheney 的一次酒吧测验中,我发现了以下结构:
a := [...]int{5, 4: 1, 0, 2: 3, 2, 1: 4}
fmt.Println(a)
>> [5 4 3 2 1 0]
Run Code Online (Sandbox Code Playgroud)
(游乐场链接)
似乎您可以在数组的初始化字段中使用键(4: 1, 0意味着将索引 4 处的元素设置为 1,将索引 5 处的元素设置为 0)。我以前从未见过这样的事情。它的用例是什么?为什么不直接设置特定的索引?
我正在使用HID驱动程序,该驱动程序将[]byte一些不同报告之一读入缓冲区。当我使用时hex.EncodeToString(buffer),它将返回一个类似于0000or或0100or 的字符串0200,我想使用开关根据HID设备的输入进行检查,因此我想在之外预先定义这些可能性,main()我应该如何确定?继续?
我尝试了以下可能性:
var LEFT []byte = []byte('0000')
// or
var LEFT []byte = `0000`
// or
var LEFT []byte = '0000'
// or
var LEFT []byte = '\x00\x00' // from the %q Printf verb
Run Code Online (Sandbox Code Playgroud)
另一种方法是hex.DecodeString("0000")在main()函数中调用。
编辑
关于提供的解决方案的注释,EncodeToString十六进制0000或0100不是四个字节,而是两个:
"\x01"== "01"=='1'
因此我可以按照建议使用0100或0200:
var LEFT []byte{1,0}
// or
var LEFT []byte("\x01\x00")
Run Code Online (Sandbox Code Playgroud)