Go语言字节序列、数字与字符串及其之间的互相转换

weiwg521 · · 1904 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

#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 ```

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1904 次点击  
加入收藏 微博
被以下专栏收入,发现更多相似内容
1 回复  |  直到 2018-12-16 18:16:38
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传