Bytes and String
方法一:我们使用强制转换方式轻松地把byte、rune数组转换成字符串。
1
2
3
|
bytes := []byte{'1', 'b'}
str = string(bytes)
bytes := []byte(str)
|
此方法拷贝了一份 Data,若对于只读数据,显然浪费内存且效率不高。
1
2
3
4
5
6
7
8
9
10
|
//方法一,转换时,开辟一新的Data空间,并拷贝数据。
type StringHeader struct {
Data uintptr
Len int
}
type SliceHeader struct {
Data uintptr
Len int
Cap int
}
|
方法二:高性能 Bytes 和 String 转换,Data指向同一个地址空间,注意 :String的Data只读!
源代码来自 Gin
1
2
3
4
5
6
7
8
9
10
11
12
|
// StringToBytes converts string to byte slice without a memory allocation.
func StringToBytes(s string) (b []byte) {
sh := *(*reflect.StringHeader)(unsafe.Pointer(&s))
bh := (*reflect.SliceHeader)(unsafe.Pointer(&b))
bh.Data, bh.Len, bh.Cap = sh.Data, sh.Len, sh.Len
return b
}
// BytesToString converts byte slice to string without a memory allocation.
func BytesToString(b []byte) string {
return *(*string)(unsafe.Pointer(&b))
}
|
Int to String
1
2
3
4
5
6
7
|
// i 转换的数字
// base 转换数字i后以 base 进制表示
// example: strconv.FormatInt(3, 2)
// output: 11
func FormatInt(i int64, base int) string
// 等价于 FormatInt(int64(i), 10)
fmt.Println(strconv.Itoa(a))
|
若于数字 num,0<= num < 100,转换成10进制表示的字符串用以上方法效率会很高,因为它直接从表里面取
1
2
3
4
5
6
7
8
9
10
11
|
const digits = "0123456789abcdefghijklmnopqrstuvwxyz"
const smallsString = "00010203040506070809" +
"10111213141516171819" +
"20212223242526272829" +
"30313233343536373839" +
"40414243444546474849" +
"50515253545556575859" +
"60616263646566676869" +
"70717273747576777879" +
"80818283848586878889" +
"90919293949596979899"
|
String to Int
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
// 方法一
// s 数字的字符串形式
// base 数字字符串的进制 比如二进制 八进制 十进制 十六进制
// bitSize 返回结果的bit大小 也就是int8 int16 int32 int64,bitSize=0表示int
// example: strconv.ParseInt("100", 2, 0)
// output: 4
func ParseInt(s string, base int, bitSize int) (i int64, err error){
...
if bitSize == 0 {
bitSize = int(IntSize)
}
...
}
//方法二,等价于ParseInt(s, 10, 0)
func Atoi(s string) (int, error)
|
Float to String
1
2
3
4
5
6
7
|
// f 转换的数字
// fmt 输出格式,常用 'f' (-ddd.dddd, no exponent)
// pre 对于'f',表示保留小数点后几位,-1表示保留的小数位于原来不变
// bitSize,含义同ParseInt
// example: strconv.FormatFloat(float64(4.12233), 'f', 2, 64)
// output: 4.12
func FormatFloat(f float64, fmt byte, prec, bitSize int) string
|
String to Float
1
2
3
4
|
// example: strconv.ParseFloat("3.2", 64)
// output: 3.0
// 若s格式不对,如 "2.1a",则返回 0
func ParseFloat(s string, bitSize int) (float64, error)
|
万能转换 —- fmt.Sprintf
1
2
3
|
// example: s = fmt.Sprintf("%.2f", 4.1233)
// output : s="4.12"
func Sprintf(format string, a ...interface{}) string
|
参考
https://blog.cyeam.com/golang/2018/06/20/go-itoa
https://yourbasic.org/golang/convert-int-to-string/