GoClub Pro

Go-byte

最近更新:2026-10-24
本页由同名 OneNote 笔记转换而来,可直接在线阅读;原始笔记文件见「Go语言相关笔记」页的原始链接。

# Go 语言中的 byte 类型详解

 

## 1. byte 类型的基本概念

 

**byte 是 uint8 的别名**,表示一个 8 位的无符号整数(0-255)。

 

```go

package main

 

import "fmt"

 

func main() {

// byte 实际上是 uint8 的别名

var b byte = 65

var u uint8 = 65

fmt.Printf("byte: %d, uint8: %d\n", b, u) // 输出: byte: 65, uint8: 65

fmt.Printf("类型: %T, %T\n", b, u) // 输出: 类型: uint8, uint8

fmt.Println(b == u) // 输出: true (它们是相同的)

}

```

 

## 2. byte 的字面值表示

 

```go

package main

 

import "fmt"

 

func main() {

// 不同的表示方式

var b1 byte = 65 // 十进制

var b2 byte = 0x41 // 十六进制

var b3 byte = 'A' // 字符

var b4 byte = 0101 // 八进制

fmt.Printf("十进制65: %c\n", b1) // A

fmt.Printf("十六进制0x41: %c\n", b2) // A

fmt.Printf("字符'A': %c\n", b3) // A

fmt.Printf("八进制0101: %c\n", b4) // A

// 显示数值

fmt.Printf("数值: %d\n", b1) // 65

}

```

 

## 3. byte 与字符的关系

 

```go

package main

 

import "fmt"

 

func main() {

// byte 可以表示 ASCII 字符

var letter byte = 'G'

var digit byte = '9'

var symbol byte = '$'

fmt.Printf("字母: %c (ASCII: %d)\n", letter, letter) // G (65)

fmt.Printf("数字: %c (ASCII: %d)\n", digit, digit) // 9 (57)

fmt.Printf("符号: %c (ASCII: %d)\n", symbol, symbol) // $ (36)

// 字符运算

var upperA byte = 'A'

var lowerA byte = upperA + 32 // 'a' 的 ASCII 比 'A' 大 32

fmt.Printf("大写: %c, 小写: %c\n", upperA, lowerA) // A, a

}

```

 

## 4. byte 切片与字符串

 

```go

package main

 

import "fmt"

 

func main() {

// 字符串与 byte 切片的关系

str := "Hello"

bytes := []byte(str)

fmt.Println("原始字符串:", str)

fmt.Println("byte切片:", bytes)

fmt.Printf("byte切片内容: ")

for i, b := range bytes {

fmt.Printf("[%d]:%c(%d) ", i, b, b)

}

fmt.Println()

// byte 切片转回字符串

newStr := string(bytes)

fmt.Println("转换回来:", newStr)

}

```

 

## 5. 实际应用场景

 

### 5.1 文件读写

```go

package main

 

import (

"fmt"

"io/ioutil"

)

 

func main() {

// 读取文件为 byte 切片

data, err := ioutil.ReadFile("test.txt")

if err != nil {

fmt.Println("读取文件错误:", err)

return

}

fmt.Printf("文件内容(%d字节): %s\n", len(data), string(data))

// 逐个字节处理

for i, b := range data {

fmt.Printf("字节[%d]: %c (0x%02x)\n", i, b, b)

}

}

```

 

### 5.2 网络数据传输

```go

package main

 

import "fmt"

 

func processNetworkData() {

// 模拟网络数据包

packet := []byte{0x48, 0x45, 0x4C, 0x4C, 0x4F} // "HELLO" 的 ASCII

fmt.Printf("数据包: %s\n", string(packet))

// 检查数据包头部

if len(packet) > 0 && packet[0] == 0x48 {

fmt.Println("数据包以 'H' 开头")

}

}

```

 

### 5.3 加密哈希

```go

package main

 

import (

"crypto/md5"

"fmt"

)

 

func main() {

data := []byte("hello world")

// 计算 MD5 哈希

hash := md5.Sum(data)

fmt.Printf("原始数据: %s\n", string(data))

fmt.Printf("MD5 哈希: %x\n", hash) // 十六进制表示

}

```

 

## 6. byte 操作常用函数

 

```go

package main

 

import (

"bytes"

"fmt"

)

 

func main() {

// 创建和操作 byte 切片

data := []byte{72, 101, 108, 108, 111} // "Hello"

// 使用 bytes 包

fmt.Println("包含 'e'?", bytes.Contains(data, []byte{'e'})) // true

fmt.Println("包含 'x'?", bytes.Contains(data, []byte{'x'})) // false

// 比较

other := []byte("Hello")

fmt.Println("数据相等?", bytes.Equal(data, other)) // true

// 查找

index := bytes.Index(data, []byte("ll"))

fmt.Printf("'ll' 在位置: %d\n", index) // 2

}

```

 

## 7. byte 与 rune 的区别

 

```go

package main

 

import "fmt"

 

func main() {

text := "Hello 世界"

fmt.Println("字符串:", text)

fmt.Println("长度:", len(text)) // byte 长度

// 按 byte 遍历 (UTF-8 编码)

fmt.Println("\n按 byte 遍历:")

for i := 0; i < len(text); i++ {

fmt.Printf("byte[%d]: %c (0x%02x)\n", i, text[i], text[i])

}

// 按 rune 遍历 (Unicode 字符)

fmt.Println("\n按 rune 遍历:")

for i, r := range text {

fmt.Printf("rune[%d]: %c (U+%04x)\n", i, r, r)

}

}

```

 

## 8. 常用转换操作

 

```go

package main

 

import (

"fmt"

"strconv"

)

 

func main() {

// 数字与 byte 的转换

num := 65

b := byte(num)

fmt.Printf("数字 %d -> byte: %c\n", num, b)

// 字符串与 byte

str := "A"

byteFromStr := str[0]

fmt.Printf("字符串 %s -> byte: %d\n", str, byteFromStr)

// byte 与十六进制字符串

hexStr := fmt.Sprintf("%02x", b)

fmt.Printf("byte %d -> 十六进制: %s\n", b, hexStr)

// 解析十六进制字符串为 byte

parsed, _ := strconv.ParseUint("41", 16, 8)

fmt.Printf("十六进制 41 -> byte: %c\n", byte(parsed))

}

```

 

## 总结

 

**byte 类型的特点:**

- 是 `uint8` 的别名,范围 0-255

- 用于表示原始二进制数据和 ASCII 字符

- 适合处理文件、网络数据等底层操作

- 字符串在底层就是 `byte` 切片

- 与 `rune`(int32)不同,`byte` 只能处理 ASCII,不能处理多字节 Unicode

 

**主要用途:**

1. 文件 I/O 操作

2. 网络数据传输

3. 加密哈希计算

4. 二进制协议处理

5. 字符串的底层操作

byte总结

内容反馈

发现错误或想补充内容?

GoClub Pro 是静态知识库,评论功能不再加载第三方脚本。你可以在 GitHub 仓库提交 Issue,反馈会直接进入项目协作流程。

提交 GitHub 反馈