>> 1 package main
2
3 import "fmt"
4
5
6 func main() {
7 | var testData string = "hello"
8 |
9 | //字符串转切片
10 | slice := []byte(testData)
11 | fmt.Printf("slice:%v\n", slice)
12
13 | //切片转字符串
14 | strData := string(slice)
15 | fmt.Printf("slice:%s\n", strData)
10 }
结果:
slice:[104 101 108 108 111]
slice:hello
>> 1 package main
2
3 import (
4 | "encoding/binary"
5 | "fmt"
6 )
7
8
9 func main() {
10 | var intData uint32 = 1024
11 | var sliceData []byte
12
13 | //整型转切片
14 | sliceData = make([]byte, 4)
15 | binary.LittleEndian.PutUint32(sliceData, intData)
16 | fmt.Printf("intData:%v\n", sliceData)
17
18 | //切片转整型
19 | aa := binary.LittleEndian.Uint32(sliceData)
20 | fmt.Printf("aa:%v\n", aa)
21 }
结果:
intData:[0 4 0 0]
aa:1024
>> 1 package main
2
3 import (
4 | "bytes"
5 | "encoding/binary"
6 | "fmt"
7 )
8
9
10 func main() {
11 | type structData struct {
12 | | intData uint32
13 | | strData []byte
14 | }
15
16 | var ss = structData{intData: 12}
17 | var buffer = bytes.Buffer{}
18 | err := binary.Write(&buffer, binary.BigEndian, ss.intData)
19 | if err != nil {
20 | | fmt.Printf("err")
21 | }
22
23 | ss.strData = make([]byte, 10)
24 | copy(ss.strData, []byte("heloo"))
25 | err = binary.Write(&buffer, binary.BigEndian, ss.strData)
26 | if err != nil {
27 | | fmt.Printf("err")
28 | }
29
30 | fmt.Printf("struct:%v\n", buffer)
31 }
结果:
struct:{[0 0 0 12 104 101 108 111 111 0 0 0 0 0] 0 0}
由于err = binary.Write(&buffer, binary.BigEndian, ss.strData)
这个函数的最后一个参数是需要有固定大小的参数,才能写入,因此 如果没有初始化的话,会之间报错。
如果结构体中的各个 参数 都是有固定长度的也可以这样写:
>> 1 package main
2
3 import (
4 | "bytes"
5 | "encoding/binary"
6 | "fmt"
7 )
8
9
10 func main() {
11 | type structData struct {
12 | | intData uint32
13 | | strData uint32
14 | }
15
16 | var ss = structData{intData: 12, strData: 12}
17 | var buffer = bytes.Buffer{}
18 | err := binary.Write(&buffer, binary.BigEndian, ss.intData)
19 | if err != nil {
20 | | fmt.Printf("err")
21 | }
22
23 | err = binary.Write(&buffer, binary.BigEndian, ss.strData)
24 | if err != nil {
25 | | fmt.Printf("err")
26 | }
27
28 | fmt.Printf("struct:%v\n", buffer)
29 }
~
结果:
struct:{[0 0 0 12 0 0 0 12] 0 0}
>> 1 package main
2
3 import (
4 | "fmt"
5 | "strconv"
6 )
7
8
9 func main() {
10 | //字符串转整型
11 | ss, err := strconv.Atoi("12")
12 | if err != nil {
13 | | fmt.Printf("err")
14 | }
15 | fmt.Printf("ss:%d\n", ss)
16
17 | aa := strconv.Itoa(ss)
18 | fmt.Printf("aa:%s\n", aa)
19
20 }
结果:
ss:12
aa:12
补充:
v1 := "100"
v2, _ := strconv.Atoi(v1) // 将字符串转化为整型,v2 = 100
v3 := 100
v4 := strconv.Itoa(v3) // 将整型转化为字符串, v4 = "100"
v5 := "true"
v6, _ := strconv.ParseBool(v5) // 将字符串转化为布尔型
v5 = strconv.FormatBool(v6) // 将布尔值转化为字符串
v7 := "100"
v8, _ := strconv.ParseInt(v7, 10, 64) // 将字符串转化为整型,第二个参数表示进制,第三个参数表示最大位数
v7 = strconv.FormatInt(v8, 10) // 将整型转化为字符串,第二个参数表示进制
v9, _ := strconv.ParseUint(v7, 10, 64) // 将字符串转化为无符号整型,参数含义同 ParseInt
v7 = strconv.FormatUint(v9, 10) // 将字符串转化为无符号整型,参数含义同 FormatInt
v10 := "99.99"
v11, _ := strconv.ParseFloat(v10, 64) // 将字符串转化为浮点型,第二个参数表示精度
v10 = strconv.FormatFloat(v11, 'E', -1, 64)
q := strconv.Quote("Hello, 世界") // 为字符串加引号
q = strconv.QuoteToASCII("Hello, 世界") // 将字符串转化为 ASCII 编码
var f float64
bits = *(*uint64)(unsafe.Pointer(&f))
type ptr unsafe.Pointer
bits = *(*uint64)(ptr(&f))
var p ptr = nil
float64就强制转换成uint64类型,float的地址就是一个值但是类型是float64,然后创建了一个uint64类型变量,地址值也是float64的地址值,两个变量值相同类型不同,强制转换了类型。
unsafe强制转换是指针的底层操作了,用c的朋友就很熟悉这样的指针类型转换,利用内存对齐才能保证转换可靠,例如int和uint存在符号位差别,利用unsafe转换后值可能不同,但是在内存存储二进制一模一样。