梦里花落0921
行为strconv.ParseUint()详见strconv.ParseInt():如果 base == 0,则基数由字符串的前缀隐含:基数 16 代表“0x”,基数 8 代表“0”,否则基数 10。对于基数 1、低于 0 或高于 36,将返回错误。所以只需使用base = 0, 然后0x前缀就会被正确解释。例如:c, err := strconv.ParseUint("0x0000", 0, 16)fmt.Println(c, err)c, err = strconv.ParseUint("0x0100", 0, 16)fmt.Println(c, err)输出(在Go Playground上尝试):0 <nil>
256 <nil>另一种选择是使用fmt.Sscanf():var c uint16
_, err := fmt.Sscanf("0x0000", "0x%04x", &c)
fmt.Println(c, err)
_, err = fmt.Sscanf("0x0100", "0x%04x", &c)
fmt.Println(c, err)输出是一样的。在Go Playground上尝试一下。
白衣染霜花
首先,您正在做的是转换,而不是类型转换。Go 根本不支持类型转换,即使支持,这也不是任何语言中类型转换的例子。但是对于您的实际问题,您有两种选择:删除“0x”前缀:c, err := strconv.ParseUint("0000", 16, 32)让 strconv 检测带有前缀的碱基,如记录的那样:如果 base == 0,则基数由字符串的前缀隐含:基数 16 代表“0x”,基数 8 代表“0”,否则基数 10。对于基数 1、低于 0 或高于 36,将返回错误。c, err := strconv.ParseUint("0x0000", 0, 32)最后,如果您的目标是转换为 a uint16,您可能应该通过请求适当的位大小来告诉 ParseUint:c, err := strconv.ParseUint("0x0000", 0, 16)