在Go中把`[]byte(string)`转换成`[]byte`或`[]byte`转换成`[]byte(string)`的方法

136 阅读3分钟

要在Go中把字符串转换为字节片,请使用标准的[]byte 转换表达式[]byte(string) 。要将字节片转换为字符串,请使用string([]byte) 转换。

将一个字符串转换为一个字节片

package main
import "fmt"
func main() {
// string to []byte
 data := []byte("Hello on https://gosamples.dev")
fmt.Println(data)
}

输出

[72 101 108 108 111 32 111 110 32 104 116 116 112 115 58 47 47 103 111 115 97 109 112 108 101 115 46 100 101 118]

将一个字节片转换为一个字符串

package main
import "fmt"
func main() {
// []byte to string
 str := string([]byte{72, 101, 108, 108, 111, 32, 111, 110, 32, 104, 116, 116, 112, 115, 58, 47, 47, 103, 111, 115, 97, 109, 112, 108, 101, 115, 46, 100, 101, 118})
fmt.Println(str)
}

输出

Hello on https://gosamples.dev

字符串和字节片的区别

字符串和字节片之间的转换非常简单,因为从技术上讲,字符串是一个只读的字节片。你可以像对待片断或数组的片断一样对待一个字符串的片断。

s := "GOSAMPLES.dev is the best Golang website in the world!"
fmt.Println(s[:13])

输出

GOSAMPLES.dev

但是你不能修改一个字符串

s := "🌈 GOSAMPLES.dev"
s[5] = 32 // compiler error: cannot assign to s[5] (strings are immutable)
fmt.Println(s)

一个字节片可以被修改

s := []byte("🌈 GOSAMPLES.dev")
s[5] = 32
fmt.Println(string(s))

输出

🌈 OSAMPLES.dev

你也可以像处理字节片一样,用for 循环来处理一个字符串的各个字节的例子:

s := "🌈 GOSAMPLES.dev"
for i := 0; i < len(s); i++ {
fmt.Println(i, s[i])
}

b := []byte("🌈 GOSAMPLES.dev")
for i := 0; i < len(b); i++ {
fmt.Println(i, b[i])
}

返回相同的输出

0 240
1 159
2 140
3 136
4 32
5 71
6 79
7 83
8 65
9 77
10 80
11 76
12 69
13 83
14 46
15 100
16 101
17 118

你可能想知道为什么13个字符的文本有18个字节那么长。这是因为字符🌈在UTF-8中被编码为4个字节(Go中的所有字符串都是UTF-8)。对于包含有超过1个字节编码的文本,在使用字符串和字节片之间还有一个区别,就是for range 循环的行为。当你在一个字符串上使用for range 循环时,你会在runesUnicode代码点)上进行迭代。

s := "🌈 GOSAMPLES.dev"
for i, c := range s {
fmt.Printf("%d: %c\n", i, c)
}

输出

0: 🌈
4:
5: G
6: O
7: S
8: A
9: M
10: P
11: L
12: E
13: S
14: .
15: d
16: e
17: v

当你在一个字节片上使用for range ,你会在单个字节上进行迭代。

b := []byte("🌈 GOSAMPLES.dev")
for i, c := range b {
fmt.Printf("%d: %c\n", i, c)
}

输出

0: ð
1:
3:
4:
5: G
6: O
7: S
8: A
9: M
10: P
11: L
12: E
13: S
14: .
15: d
16: e
17: v