#Go语言字节序列、数字与字符串及其之间的互相转换
int int64 uint uint64 float64 string []byte之间的转换
---
## 1 strconv包
实现了字符串和基本数据类型之间的转换。
### 1.1 int和string转换
```
i, err := strconv.Atoi("-42") //string->int
s := strconv.Itoa(-82) //int->string
fmt.Println("int<-->string:", i, err, s)
--------------------------------------
int<-->string: -42 <nil> -82
```
### 1.2 字符串转为数字
```
b, err := strconv.ParseBool("true") //转为布尔值
f, err := strconv.ParseFloat("3.1415", 64) //转为64位浮点数
h, err := strconv.ParseInt("-42", 10, 64) //转为10进制64位整数
u, err := strconv.ParseUint("42", 10, 64) //转为10进制64位无符号整数
fmt.Println("string-->number:", b, f, h, u)
-----------------------------------------
string-->number: true 3.1415 -42 42
```
### 1.3 数字转为字符串
```
s1 := strconv.FormatBool(true)
s2 := strconv.FormatFloat(30.1415, 'E', 2, 64) //保留2位小数的科学计数法
s3 := strconv.FormatInt(-42, 16) //转为16进制数表示的字符串
s4 := strconv.FormatUint(42, 2) //转为2进制数表示的字符串
fmt.Println("number-->string:", s1, s2, s3, s4)
---------------------------------------------------
number-->string: true 3.01E+01 -2a 10000010101010011010100
```
### 1.4 字符串转换
```
p := strconv.Quote(`"Fran & Freddie's Diner ☺
"`) //返回字符串,并用go转义序列表示其中的控制字符和不可打印字符
p1 := strconv.QuoteRune(' ') //返回单引号字符,转义同上
//返回单引号字符,用转义表示非ASCII字符和不可打印字符
p2 := strconv.QuoteRuneToASCII('☺')
//返回字符串的引用值,输入如"`Hello`",`"Hello"`,"'v'","\"Hello\""
p3, _ := strconv.Unquote("You can't unquote a string without quotes") //返回 ""
q := strconv.QuoteToASCII("Hello ,世界")
fmt.Println(p)
fmt.Println(p1, p2, p3, q)
-----------------------------------------------------------------
"\"Fran & Freddie's \tDiner\t☺\n\t\t\t \""
'\t' '\u263a' "Hello ,\u4e16\u754c"
```
## 2 fmt包实现格式化输出
### 2.1 类C语言的格式化输出
```
sf1 := fmt.Sprintf("%12.2f", -12.069) //总长度位12,2位小数,靠右对齐的字符串
sf2 := fmt.Sprintf("%-12.2f", 12.068) //总长度位12,2位小数,左对齐的字符串
sf3 := fmt.Sprintf("%d %d %#[1]x %#x", 16, 17)
fmt.Println(sf1, sf2, sf3)
-------------------------------------
-12.07
12.07
16 17 0x10 0x11
```
## 3 encoding/binary包
主要用于数字和字节序列转换。Go语言中的int和uint类型依赖于平台可能是32/64位,是不固定位数的整数,很多函数不支持直接使用,需要转为int64或uint64使用
### 3.1数字的默认类型
```
var int1 = 123456 //默认为int类型数据,根据系统平台32/64
//如binary.Size(int1) 将返回-1 而binary.Size(int64(int1))返回4
var int2 int64 = int64(int1) //两种类型需要强制转换
var flt1 = 123.4567 //默认float64
var int3 = int64(flt1) //转为整数将截断小数部分
fmt.Printf("%T,%T,%T,%T\n", int1, int2, flt1, int3)
---------------------------------------
int,int64,float64,int64
```
### 3.2 int64和uint64与字节序列的转换
```
var len1 = binary.Size(int64(123525)) //字节长度
buf := make([]byte, binary.MaxVarintLen64) //定义字节切片用于接收字节序列
len2 := binary.PutVarint(buf, int64(12312321)) //将int64转为字节序列
byts := buf[:len2] //有效的字节序列
res1, len3 := binary.Varint(buf) //返回int64,有效长度
fmt.Println(len1, len2, buf, byts)
fmt.Println(res1, len3)
----------------------------------
8 4 [130 252 222 11 0 0 0 0 0 0] [130 252 222 11]
12312321 4
```
### 3.3 其它固定长度类型值与字节序列的转换
```
buff := new(bytes.Buffer) //可变长度的字节序列
var pi = math.Pi
//只支持固定位类型即这里int/uint等必须转int64/uint64
err := binary.Write(buff, binary.LittleEndian, pi)
if err != nil {
fmt.Println("binary.Write failed:", err)
}
fmt.Printf("% x,%d\n", buff.Bytes(), buff.Len())
------------------------------------
18 2d 44 54 fb 21 09 40,8
```
## 4 字符串和字节序列的转换
```
bts1 := []byte("hello,世界你好") //先切片再将元素转为byte
bts2 := []rune("hello,世界你好") //同上
fmt.Println("UTF-8:", string(bts1), bts1, len(bts1))
fmt.Println("Unicode:", string(bts2), bts2, len(bts2))
--------------------------------------
UTF-8: hello,世界你好 [104 101 108 108 111 44 228 184 150 231 149 140 228 189 160 229 165 189] 18
Unicode: hello,世界你好 [104 101 108 108 111 44 19990 30028 20320 22909] 10
```
## 5 math/big包
实现了任意精度的大数的数学运算,包括整数、浮点、有理数
```
a := big.NewInt(9999999999) //使用int64初始化大整数
b := big.NewInt(99999123456) //使用int64初始化大整数
mul := a.Mul(a, b).Exp(a, big.NewInt(5), nil) //大整数的乘法、乘方运算
fmt.Println(mul)
c := big.NewRat(int64(138040), int64(625)) //分数表示
fmt.Println(c, c.Inv(c)) //倒数
d := big.NewFloat(123568.12525)
d.MantExp(d)
fmt.Printf("%.50f", d)
-----------------------------------------
999982468996836444564233237013248329383936
125/27608 125/27608
0.94274997901916501863439634689711965620517730712891
```
有疑问加站长微信联系(非本文作者))