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/