Golang中如何检查map的值是否为整数
Golang中如何检查map的值是否为整数 这又是一个我想理解其概念的基础编程问题。
我有一组预定义的键值对,位于 Pkey 下,并且应该符合以下格式:
即键是 字符串 类型,与之关联的值应该是 十六进制 ‘0x’。我不知道如何将值声明为十六进制类型。
问题如下:
- 如何在字典中为键分配十六进制值?
- 如果存在 “DS_256” : 124 这种格式,我的程序应该遍历
Pkeys的范围,如果找到0xValue则跳过,否则将非十六进制值转换为十六进制并存储在数组中。即,将 124 识别为整数(因为没有0x前缀)并应将其转换为十六进制。
我创建了一个字典,其值如下所示。
我想检查 ES_128 的值是否为整数并进行一些转换。
我能够检查键是否存在于映射中,但如何检查该键的值是否为整数呢?
(之前只是测试 unicode 的功能,结果出错了)
var Pkeys = map[string]int64 {
"ES_128" : 0x00AA,
"PS_256" : 0x00A8,
"DS_256" : 124,
}
type PCdecipher struct {
defTab map[string]int
}
func (pc *PCdecipher) init(Pkeys map[string]int64) {
for _, value := range Pkeys {
if unicode.IsNumber(value) {
fmt.Printf("Found")
}
fmt.Printf(" : 0x0%x",value)
}
}
func main() {
var pc PCdecipher
pc.init(Pkeys)
}
更多关于Golang中如何检查map的值是否为整数的实战教程也可以访问 https://www.itying.com/category-94-b0.html
感谢 @skillian 我修改了问题,但当我真正开始编码时,心中充满了许多疑问。
更多关于Golang中如何检查map的值是否为整数的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
XY问题是指询问你尝试的解决方案,而非你实际面临的问题:XY问题。
请告诉我们你实际面临的问题是什么。
amelia:
var Pkeys = map[string]int64 {
你将 Pkeys 定义为一个从 string 到 int64 的映射,因此映射中的值必须是 int64 类型。
unicode.IsNumber 用于检查一个 rune 值(例如 'a'、'0'、'$' 等)是否为数字码点,但在你的 (*PCdecipher).init 函数中,value 是一个 int64 类型,因此它不能被传递给 unicode.IsNumber,所以你会得到以下错误:
./prog.go:21:22: cannot use value (type int64) as type rune in argument to unicode.IsNumber
Go build failed.
根据你的示例,我无法判断你试图做什么。你能添加更多描述吗?这样也许有人能给你一些建议。
在Go语言中,map的值类型在声明时就已经确定,无法在运行时检查值的具体类型。根据你的代码,Pkeys 的值的类型是 int64,因此所有值都是整数。十六进制表示只是整数的不同书写格式。
以下是针对你问题的解决方案:
package main
import (
"fmt"
)
func main() {
// 1. 在map中分配十六进制值
Pkeys := map[string]int64{
"ES_128": 0x00AA, // 十六进制直接以0x开头
"PS_256": 0x00A8,
"DS_256": 124, // 十进制会自动转换为int64
}
// 2. 处理非十六进制显示的值
var hexValues []string
for key, value := range Pkeys {
// 检查值是否在0-255范围内(示例条件)
if value >= 0 && value <= 255 {
// 将值转换为十六进制字符串
hexStr := fmt.Sprintf("0x%02X", value)
hexValues = append(hexValues, fmt.Sprintf("%s: %s", key, hexStr))
fmt.Printf("%s -> %s\n", key, hexStr)
}
}
fmt.Println("\n所有十六进制值:", hexValues)
}
更完整的实现,包含结构体方法:
package main
import (
"fmt"
)
type PCdecipher struct {
hexValues []string
}
func (pc *PCdecipher) init(Pkeys map[string]int64) {
for key, value := range Pkeys {
// 所有值都是int64,直接转换为十六进制
hexStr := fmt.Sprintf("0x%04X", value)
pc.hexValues = append(pc.hexValues, fmt.Sprintf("%s: %s", key, hexStr))
fmt.Printf("键: %s, 值: %d, 十六进制: %s\n", key, value, hexStr)
}
}
func (pc *PCdecipher) getHexValues() []string {
return pc.hexValues
}
func main() {
Pkeys := map[string]int64{
"ES_128": 0x00AA,
"PS_256": 0x00A8,
"DS_256": 124,
}
var pc PCdecipher
pc.init(Pkeys)
fmt.Println("\n存储的十六进制值:")
for _, v := range pc.getHexValues() {
fmt.Println(v)
}
}
如果你需要处理字符串类型的值并检查是否为十六进制格式:
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// 如果值需要存储为字符串
Pkeys := map[string]string{
"ES_128": "0x00AA",
"PS_256": "0x00A8",
"DS_256": "124",
}
var hexValues []string
for key, value := range Pkeys {
// 检查是否已经是十六进制格式
if strings.HasPrefix(value, "0x") || strings.HasPrefix(value, "0X") {
// 已经是十六进制格式
hexValues = append(hexValues, fmt.Sprintf("%s: %s", key, value))
fmt.Printf("%s 已经是十六进制: %s\n", key, value)
} else {
// 尝试解析为整数并转换为十六进制
if intValue, err := strconv.ParseInt(value, 10, 64); err == nil {
hexStr := fmt.Sprintf("0x%04X", intValue)
hexValues = append(hexValues, fmt.Sprintf("%s: %s", key, hexStr))
fmt.Printf("%s 转换后: %s -> %s\n", key, value, hexStr)
}
}
}
}
在Go中,0x前缀只是在代码中表示十六进制字面量的方式,实际存储时都是整数。要区分一个值是否以十六进制形式输入,你需要将其存储为字符串类型。


