看懂golang怎么实现int与string转换

1,632 阅读2分钟

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的数,后面表示是要转为多少进制,再将其转为字符串

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