Golang 挖坑之旅——常量转换问题

Golang 挖坑之旅——常量转换问题

0. 问题描述

参考如下代码:

package main

import (
	"fmt"
)
// 这段代码简单进行一个实验,将尝试使用byte对123123进行截断
func main() {
     
	var x = 123123
	fmt.Printf("%b\n", byte(x))
	fmt.Printf("%b\n", byte(123123))
}

代码的目的是对123123使用byte截断,但是通过运行上述代码,会发现在第10行报错,错误信息为constant 480 overflows byte。通过注释第10行,代码是可以正常运行的。

那么问题来了,为什么同样的一个功能,两种实现,为什么通过常量操作的第10行无法运行。

1. 错误分析

首先报错分析,直观来看,错误是byte无法对123123这个int类型的常量进行强制类型转换时出现了溢出问题,但是在对int变量x进行同类型操作时没有出现问题,所以问题在常量的类型转换上。

根据官网对常量的描述部分:

Numeric constants represent exact values of arbitrary precision and do not overflow.

我们知道了,常量是不溢出的,但这是浅层次原因,通过查阅进一步资料,在官网的类型转换部分,有如下解释:

A constant value x can be converted to type T if x is representable by a value of T.

常量可以转换,仅限于转换类型T可以表示x,这里的常量123123是无法直接表示为byte类型的,所以出了问题。而变量的类型转换:

A non-constant value x can be converted to type T in any of these cases:

  • **x is assignable to T. **// 主要原因
  • ignoring struct tags (see below), x's type and T have identical underlying types.
  • ignoring struct tags (see below), x's type and T are pointer types that are not defined types, and their pointer base types have identical underlying types.
  • x's type and T are both integer or floating point types.
  • x's type and T are both complex types.
  • x is an integer or a slice of bytes or runes and T is a string type.
  • x is a string and T is a slice of bytes or runes.

变量转换只要能赋值过去就行,int类型的变量经过截断操作是可以赋值给byte类型的,所以没问题。

2. 问题解决

  1. 要么控制产量的大小在byte允许范围内,例如123
  2. 要么用变量承载它

3. 小结

这是一个比较小的问题,作为一个golang的初学者,不懂就要记下来。

你可能感兴趣的:(golang,go,golang)