Golang中为什么不能将int类型赋值给byte类型

Golang中为什么不能将int类型赋值给byte类型 为什么无法执行以下操作

rot13[i] = val + num

但这样操作却是可行的

rot13[i] = val + 22

如果我没弄错的话,22和num都是整型,所以我不理解为什么会发生这种情况

func rotate(word []byte, num int) []byte {
var rot13 = make([]byte, len(word))
for i, val := range word {
	if val <= 109 {
		rot13[i] = val + num
	}else {
		rot13[i] = val - num
	}
  }
 return rot13
   }

更多关于Golang中为什么不能将int类型赋值给byte类型的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

谢谢

更多关于Golang中为什么不能将int类型赋值给byte类型的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


太棒了 ❤️ 🙂

Calmh、Sunnykarira,非常感谢各位,你们真的帮助我更好地理解了 Golang

int 类型与 byte 类型不同,Go 语言不会进行隐式转换。你可以通过 byte(num) 自行转换,但需要注意由于 int 类型范围大于 byte,转换时会发生数值截断。

常量 22 并不是 int 类型——它是无类型常量。这类常量可根据上下文转换为任意数值类型。在当前场景中,由于处于 byte 上下文环境,它会被转换为 byte 常量。

若没有明确的上下文环境,数值整型常量默认会转为 int 类型(var foo = 22 // foo 现在是 int 类型),这正是你所考虑的情况。

以下是关于常量的深入解析:https://blog.golang.org/constants

func main() {
    fmt.Println("hello world")
}

在Go语言中,byte类型是uint8的别名,范围是0-255。当您执行val + num时,由于numint类型,这个表达式的结果会被推断为int类型,而int类型不能直接赋值给byte类型,需要显式类型转换。

当您使用val + 22时,22是一个无类型的数字常量,Go编译器会根据上下文将其视为与val兼容的类型(这里是byte),因此可以直接赋值。

以下是修正后的代码示例:

func rotate(word []byte, num int) []byte {
    var rot13 = make([]byte, len(word))
    for i, val := range word {
        if val <= 109 {
            rot13[i] = byte(val + byte(num))
        } else {
            rot13[i] = byte(val - byte(num))
        }
    }
    return rot13
}

或者更安全的版本,确保不会发生溢出:

func rotate(word []byte, num int) []byte {
    var rot13 = make([]byte, len(word))
    for i, val := range word {
        var result int
        if val <= 109 {
            result = int(val) + num
        } else {
            result = int(val) - num
        }
        
        // 确保结果在byte范围内
        if result < 0 {
            result = 0
        } else if result > 255 {
            result = 255
        }
        rot13[i] = byte(result)
    }
    return rot13
}

第一个修复方案直接将num转换为byte类型进行计算,第二个方案则更完整地处理了可能的溢出情况。

回到顶部