ZetCode

Golang byte 类型

最后修改时间 2025 年 5 月 8 日

本教程提供了关于 Go 中 byte 内置类型使用的全面指南。字节对于处理二进制数据和文本至关重要,是各种编程任务的基本组成部分。通过实际示例,我们将探讨字节的功能以及如何在 Go 应用程序中有效地使用它们。

Go 中的 byte 类型是 uint8 的别名,意味着它可以存储从 0 到 255 的整数值。由于字节通常用于表示 ASCII 字符,因此它们在文本处理和编码中起着至关重要的作用。字节操作允许开发人员高效地操作单个字符,这对于需要精确数据处理的系统来说是必不可少的。

在 Go 中,byte 类型广泛用于 I/O 操作、网络通信和字符串操作。无论是从文件读取数据、处理网络数据包还是对字符串执行底层操作,理解字节的工作原理对于优化性能和内存使用至关重要。掌握字节操作有助于开发人员构建高效、高速的应用程序,同时保持对数据处理的控制。

基本字节声明和用法

处理字节的最简单方法是声明字节变量并执行基本操作。此示例展示了字节的基础知识。
注意:字节字面量可以写成十进制或十六进制值。

basic_byte.go
package main

import "fmt"

func main() {

    var b1 byte = 65      // ASCII 'A'
    b2 := byte('B')       // byte from rune
    b3 := byte(0x43)      // hex value 'C'
    
    fmt.Printf("b1: %c, b2: %c, b3: %c\n", b1, b2, b3)
    fmt.Printf("Sum: %d\n", b1+b2+b3) // Sum as numbers
    
    // Byte to string conversion
    byteSlice := []byte{b1, b2, b3}
    fmt.Println("String:", string(byteSlice))
}

该示例展示了创建字节值的三种方法。字节可以作为字符或数字打印。字节切片可以干净地转换为字符串。

使用字节切片

字节切片是 Go 中处理数据的基础部分,尤其是在 I/O 操作、字符串操作和数据处理方面。与不可变的字符串不同,字节切片允许直接修改和高效操作。以下示例演示了重要的字节切片操作,包括转换、修改、提取和追加。

byte_slice.go
package main

import "fmt"

func main() {
    // Convert a string to a byte slice
    str := "Hello there!"
    bytes := []byte(str)
    fmt.Printf("Bytes: %v\n", bytes)

    // Modify specific bytes within the slice
    bytes[6] = 'G'
    bytes[7] = 'o'
    fmt.Println("Modified:", string(bytes))

    // Extract a portion (subslice) of the byte slice
    subslice := bytes[0:5]
    fmt.Println("Subslice:", string(subslice))

    // Append a new character to the byte slice
    bytes = append(bytes, '!')
    fmt.Println("Appended:", string(bytes))
}

示例首先使用 []byte(str) 将字符串转换为字节切片,从而允许直接操作其内容。与不可变的字符串不同,字节切片提供了动态修改数据的灵活性。转换后,程序会替换特定字符,展示了如何在切片中修改单个字节。

为了进一步说明切片操作,代码使用 bytes[0:5] 提取了字节切片的一部分。此操作在处理结构化二进制数据或分段文本时非常有用。最后,程序使用 append() 追加了一个新字符,展示了字节切片如何在无需额外内存分配的情况下动态扩展。

字节切片是处理 Go 中的二进制数据、编码操作和自定义文本处理的强大工具。它们的易变性和高效性使其成为应用程序中性能优化和动态内容处理的关键。

字节操作和位运算

字节通常用于位级操作。此示例展示了字节的常见位操作技术。

bit_operations.go
package main

import "fmt"

func main() {

    var b byte = 0b10101010 // Binary literal
    
    fmt.Printf("Original: %08b\n", b)
    
    // Set bit 3 (0-based)
    b |= 1 << 3
    fmt.Printf("Set bit 3: %08b\n", b)
    
    // Clear bit 5
    b &^= 1 << 5
    fmt.Printf("Clear bit 5: %08b\n", b)
    
    // Toggle bit 7
    b ^= 1 << 7
    fmt.Printf("Toggle bit 7: %08b\n", b)
    
    // Check bit 2
    if b&(1<<2) != 0 {
        fmt.Println("Bit 2 is set")
    }
}

该示例演示了在字节中设置、清除、切换和检查位。位操作对于底层编程至关重要。

从输入读取字节

字节通常用于读取输入数据。此示例显示了如何从标准输入读取字节。

read_bytes.go
package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {

    reader := bufio.NewReader(os.Stdin)
    fmt.Print("Enter text: ")
    
    // Read up to 10 bytes
    input, _ := reader.ReadBytes('\n')
    
    fmt.Printf("You entered %d bytes: %v\n", len(input), input)
    fmt.Printf("As string: %s", input)
    
    // Alternative: Read single byte
    fmt.Print("\nPress any key: ")
    char, _ := reader.ReadByte()
    fmt.Printf("\nYou pressed: %c (%d)\n", char, char)
}

ReadBytes 方法一直读取直到分隔符。ReadByte 读取单个字节。两者都适用于不同的输入场景。

十六进制编码/解码

字节是编码操作的基础。此示例演示了字节数据的十六进制编码和解码。

hex_encoding.go
package main

import (
    "encoding/hex"
    "fmt"
)

func main() {

    // Original data
    data := []byte("Hello, Go!")
    fmt.Printf("Original: %s\n", data)
    
    // Encode to hex
    encoded := hex.EncodeToString(data)
    fmt.Println("Encoded:", encoded)
    
    // Decode from hex
    decoded, err := hex.DecodeString(encoded)
    if err != nil {
        panic(err)
    }
    fmt.Printf("Decoded: %s\n", decoded)
    
    // Working with hex literals
    hexBytes := []byte{0x48, 0x65, 0x6c, 0x6c, 0x6f}
    fmt.Println("Hex literals:", string(hexBytes))
}

该示例使用 hex 包展示了十六进制编码/解码。十六进制通常用于文本格式中的二进制数据表示。

将文件转换为字节切片

字节切片的一个常见用例是读取和写入文件,例如图像或二进制数据。以下示例演示了如何将图像文件读取到字节切片中,然后将其写回磁盘。这对于在 Go 中处理、传输或存储二进制数据非常有用。

file_to_bytes.go
package main

import (
    "fmt"
    "io/ioutil"
    "os"
)

func main() {
    // Read the entire file into a byte slice
    data, err := ioutil.ReadFile("input.png")
    if err != nil {
        fmt.Println("Error reading file:", err)
        return
    }
    fmt.Printf("Read %d bytes from input.png\n", len(data))

    // Write the byte slice to a new file
    err = ioutil.WriteFile("output.png", data, 0644)
    if err != nil {
        fmt.Println("Error writing file:", err)
        return
    }
    fmt.Println("Wrote data to output.png")
}

此示例使用 ioutil.ReadFile 将整个文件读取到字节切片中,并使用 ioutil.WriteFile 将字节切片写回新文件。此技术广泛用于 Go 应用程序中的文件操作、上传和下载二进制数据。

来源

Go 语言规范

本教程通过字节操作、I/O 和编码操作的实际示例,涵盖了 Go 中的 byte 类型。

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1,400 多篇文章和 8 本电子书。我在教学编程方面拥有十多年的经验。

列出所有 Golang 教程