Golang中如何检查map的值是否为整数

Golang中如何检查map的值是否为整数 这又是一个我想理解其概念的基础编程问题。

我有一组预定义的键值对,位于 Pkey 下,并且应该符合以下格式: 即键是 字符串 类型,与之关联的值应该是 十六进制 ‘0x’。我不知道如何将值声明为十六进制类型。

问题如下:

  1. 如何在字典中为键分配十六进制值?
  2. 如果存在 “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

5 回复

感谢 @skillian 我修改了问题,但当我真正开始编码时,心中充满了许多疑问。

更多关于Golang中如何检查map的值是否为整数的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


XY问题是指询问你尝试的解决方案,而非你实际面临的问题:XY问题

请告诉我们你实际面临的问题是什么。

amelia: 我不知道如何将值声明为十六进制类型。

Go语言中没有“十六进制”类型。十六进制是值的一种表示形式。以下常量都是相同的:

const (
    a = 123
    b = 0173
    c = 0x7b
)

它们都是相同的 int 值。这是一个将它们全部以十进制、八进制和十六进制形式打印出来的程序:Go Playground - The Go Programming Language

我认为petrus的观点是正确的:你能重新描述一下问题吗?你为什么要尝试重写映射中的值以使其显示为十六进制?

amelia:

var Pkeys = map[string]int64 {

你将 Pkeys 定义为一个从 stringint64 的映射,因此映射中的值必须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前缀只是在代码中表示十六进制字面量的方式,实际存储时都是整数。要区分一个值是否以十六进制形式输入,你需要将其存储为字符串类型。

回到顶部