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
太棒了 ❤️ 🙂
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时,由于num是int类型,这个表达式的结果会被推断为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类型进行计算,第二个方案则更完整地处理了可能的溢出情况。

