golang新手都需要的技能之一,就是int和string的转化,从java过来的朋友会发现,golang的转换似乎比java麻烦,起码int没法直接转,本文就梳理一下转化逻辑,希望对你有帮助。
int to string
需要用到strconv
func main() {
var a int = 72
stra := strconv.Itoa(a)
fmt.Printf("int %d to string is : %s\n", a, stra)
stra2 := string(a)
fmt.Printf("stra2 is %v", stra2)
}
结果是:
int 1238 to string is : 1238
stra2 is Ӗs
需要注意的是,第二种用string()直接转的方式是直接将数字作为utf8编码转化为其对应的符号
比如
fmt.Printf("string(97) == \"a\" is %v \n", string(97) == "a")
结果是:
string(97) == "a" is true
int64 to string
var b int64 = 10
strb1 := strconv.FormatInt(b, 10)
strb2 := strconv.FormatInt(b, 2)
fmt.Printf("int64 %d string is : %s\n", b, strb1)
fmt.Printf("int64 %d string is : %s\n", b, strb2)
结果是:
int64 10 string is : 10
int64 10 string is : 1010
Itoa 只能转int类型to string,int64需要用FormatInt。
该函数:
func FormatInt(i int64, base int) string {
if fastSmalls && 0 <= i && i < nSmalls && base == 10 {
return small(int(i))
}
_, s := formatBits(nil, uint64(i), base, i < 0, false)
return s
}
i 为int64的数,后面表示是要转为多少进制,再将其转为字符串
int/int64 to string
var c int64 = 123
sss := fmt.Sprintf("%v", c)
fmt.Printf("%d 的字符串 %s", c, sss)
结果:
123 的字符串 123
使用fmt的Sprintf函数,该函数不输出,只返回结果字符串
string to int
s := "32"
fmt.Printf("string \"32\" to int is %d\n", s)
结果是:
string "32" to int is %!d(string=32)
string to int64
ss := "1832"
res1, _ := strconv.ParseInt(ss, 10, 64)
fmt.Printf("base 10, 64bit is %d\n", res1)
res2, _ := strconv.ParseInt(ss, 16, 64)
fmt.Printf("base 16, 64bit is %d\n", res2)
res3, _ := strconv.ParseInt(ss, 10, 8)
fmt.Printf("base 16, 1bit is %d\n", res3)
结果:
base 10, 64bit is 1832
base 16, 64bit is 6194
base 16, 1bit is 127
第一个参数为字符串,第二个参数为进制, 第三个参数为位数n
将字符串转化为10进制,再转为对应的进制,放到n bit里。
由于默认为有符号数,所以8位的int最大存储127
第二个参赛base取值(0, 2~36)
第三个参数bit取值(0~64)
base为0时,默认的取值方式为前缀法:
- 0b开头: base = 2
- 0或0o开头: base = 8
- 0x开头: base = 16
- 其他: base = 10
bit 取值为 0 8 16 32 64,代表int int8 int16 int32 int64
大于64或小于0 返回error
- 返回*NumError类型的时候,会将原参数带上,err.Num = s;
- 如果是不合规定的字符,err.Err = ErrSyntax,value is 0
- 如果这个数给定的位数无法承载,则返回给定范围的有符号数的最大值,且有error:err.Err = ErrRange