英文:
Parse string to specific type of int (int8, int16, int32, int64)
问题
我正在尝试在Go中将字符串解析为整数。我在其中遇到的问题是在文档中提到的语法如下:
ParseInt(s string, base int, bitSize int)
其中,s
是要解析的字符串,base
由字符串的前缀隐含:对于 "0x",基数为 16;对于 "0",基数为 8;否则基数为 10。
我在 bitSize
参数上遇到了问题。根据 ParseInt 的文档,它指定了结果必须适应的整数类型。位大小 0、8、16、32 和 64 对应于 int、int8、int16、int32 和 int64。
但是对于所有的值,如 0、8、16、32 和 64,我得到的返回值类型都是相同的,即 int64 类型。
有人能指出我漏掉了什么吗?
代码:https://play.golang.org/p/F3LbUh_maY
英文:
I am trying to parse a string into an integer in Go. The Problem I found with it is in the documentation its mentioned syntax is as follows:
ParseInt(s string, base int, bitSize int)
where, s
is the string to be parsed, base
is implied by the string's prefix: base 16 for "0x", base 8 for "0", and base 10 otherwise.
The bitSize
parameter is where I am facing problem. As per documentation of ParseInt, it specifies the integer type that the result must fit into. Bit sizes 0, 8, 16, 32, and 64 correspond to int, int8, int16, int32, and int64.
But for all the values like 0, 8, 16, 32, and 64. I am getting same type return value. I.e of int64 type.
Could anyone point me out what am I missing.
答案1
得分: 49
根据文档:
ParseInt
函数始终返回int64
类型的值。此外,
bitSize
参数指定结果必须适应的整数类型。
因此,bitSize
参数只是告诉你在解析字符串值之后,它应该适应的位大小。如果不适应,则会发生超出范围的情况。
就像在这个kbd中所示的例子:strconv.ParseInt("192", 10, 8)
(你可以看到解析后的值将大于int8
的最大值)。
如果你想将其解析为所需的任何值,只需在解析后使用int8(i)
(int8
、int16
、int32
)即可。
P.S. 由于你提到了如何转换为特定的intX
,我还要提一下,也可以转换为无符号整数。
英文:
As per documentation
> func ParseInt(s string, base int, bitSize int) (i int64, err error)
ParseInt always return int64
no matter what. Moreover
> The bitSize argument specifies the integer type that the result must
> fit into
So basically the your bitSize
parameter only tells that the string value that you are going to parse should fit the bitSize after parsing. If not, out of range will happen.
Like in this <kbd>PlayGround</kbd>: strconv.ParseInt("192", 10, 8)
(as you see the value after the parsing would be bigger than maximum value of int8
).
If you want to parse it to whatever value you need, just use int8(i)
afterwards (int8
, int16
, int32
).
P.S. because you touched the topic how to convert to specific intX, I would outline that it is also possible to convert to unsigned int.
答案2
得分: 41
ParseInt
始终返回一个int64
,你需要将结果转换为你想要的类型。当你将32
作为第三个参数传递时,如果解析的值无法适应int32
,则会出现解析错误,但返回的类型始终是int64
。
例如:
i, err := strconv.ParseInt("9207", 10, 32)
if err != nil {
panic(err)
}
result := int32(i)
fmt.Printf("Parsed int is %d\n", result)
英文:
ParseInt
always returns an int64
, and you need to convert the result to your desired type. When you pass 32
as the third argument, then you'll get a parse error if the parsed value won't fit into an int32
, but the returned type is always int64
.
For example:
i, err := strconv.ParseInt("9207", 10, 32)
if err != nil {
panic(err)
}
result := int32(i)
fmt.Printf("Parsed int is %d\n", result)
答案3
得分: 2
你可以使用Sscan
函数:
package main
import "fmt"
func main() {
{
var n int8
fmt.Sscan("100", &n)
fmt.Println(n == 100)
}
{
var n int16
fmt.Sscan("100", &n)
fmt.Println(n == 100)
}
{
var n int32
fmt.Sscan("100", &n)
fmt.Println(n == 100)
}
{
var n int64
fmt.Sscan("100", &n)
fmt.Println(n == 100)
}
}
https://golang.org/pkg/fmt#Sscan
英文:
You can use Sscan
:
package main
import "fmt"
func main() {
{
var n int8
fmt.Sscan("100", &n)
fmt.Println(n == 100)
}
{
var n int16
fmt.Sscan("100", &n)
fmt.Println(n == 100)
}
{
var n int32
fmt.Sscan("100", &n)
fmt.Println(n == 100)
}
{
var n int64
fmt.Sscan("100", &n)
fmt.Println(n == 100)
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论