ZetCode

Golang uint8 类型

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

本教程将解释如何在 Go 中使用 `uint8` 内置类型。我们将通过实际示例介绍使用 8 位无符号整数的基本概念。

Go 中的 `uint8` 类型表示一个 8 位无符号整数。它可以存储从 0 到 255 的值。当小正数足够时,此类型常用于提高内存效率。

在 Go 中,`uint8` 是几种无符号整数类型之一。它特别适用于二进制数据、像素值以及不需要负数的情况。

基本的 uint8 声明和用法

`uint8` 最简单的用法包括变量声明和基本算术。此示例演示了基本操作。
注意: uint8 值不能为负数。

basic_uint8.go
package main

import "fmt"

func main() {

    var a uint8 = 200
    var b uint8 = 55
    
    sum := a + b
    diff := a - b
    product := a * b
    
    fmt.Println("Sum:", sum)
    fmt.Println("Difference:", diff)
    fmt.Println("Product:", product)
    
    // This would cause overflow
    // overflow := a * b * 2
    // fmt.Println("Overflow:", overflow)
}

该示例展示了 uint8 值的基本算术运算。请注意,结果超出 0-255 范围的操作将静默溢出。

使用 uint8 和 byte 类型

在 Go 中,`uint8` 是 `byte` 类型的别名。此示例演示了它们的互换性和常见用法。

uint8_byte.go
package main

import "fmt"

func main() {

    // uint8 and byte are equivalent
    var u uint8 = 'A'
    var b byte = 65
    
    fmt.Printf("uint8: %c, byte: %c\n", u, b)
    
    // Working with byte slices
    data := []byte{'H', 'e', 'l', 'l', 'o'}
    fmt.Println("Byte slice:", string(data))
    
    // Converting between types
    var num uint8 = 123
    var char byte = byte(num)
    fmt.Printf("Number: %d, Character: %c\n", num, char)
}

该示例展示了 uint8 和 byte 如何互换使用。这在处理二进制数据或 ASCII 字符时特别有用。

处理 uint8 溢出

由于 uint8 的范围有限,可能会发生溢出。此示例演示了如何检测和处理潜在的溢出情况。

uint8_overflow.go
package main

import (
    "fmt"
    "math"
)

func safeAdd(a, b uint8) (uint8, bool) {
    if math.MaxUint8 - a < b {
        return 0, false // Overflow would occur
    }
    return a + b, true
}

func main() {

    var x uint8 = 200
    var y uint8 = 100
    
    // Regular addition that would overflow
    result1 := x + y
    fmt.Println("Overflowed result:", result1) // 44 (200 + 100 - 256)
    
    // Safe addition with overflow check
    result2, ok := safeAdd(x, y)
    if !ok {
        fmt.Println("Addition would overflow!")
    } else {
        fmt.Println("Safe result:", result2)
    }
}

`safeAdd` 函数在执行加法之前会检查潜在的溢出。这种模式有助于防止算术运算中的细微错误。

在数组和切片中使用 uint8

uint8 常用于数组和切片中以紧凑地存储数据。此示例展示了实际应用。

uint8_slices.go
package main

import "fmt"

func main() {

    // Pixel data (RGB values)
    pixels := [3]uint8{255, 128, 0}
    fmt.Printf("Pixel: R=%d, G=%d, B=%d\n", 
        pixels[0], pixels[1], pixels[2])
    
    // Compact data storage
    data := []uint8{0x48, 0x65, 0x6c, 0x6c, 0x6f}
    fmt.Println("Message:", string(data))
    
    // Processing uint8 slices
    var sum uint16
    for _, val := range data {
        sum += uint16(val)
    }
    fmt.Println("Sum of bytes:", sum)
}

该示例演示了 uint8 在像素数据和紧凑存储中的用法。请注意,在求和以防止溢出时会转换为 uint16。

使用 uint8 进行位操作

由于其尺寸小,uint8 非常适合进行位级操作。此示例展示了常见的位操作技术。

uint8_bits.go
package main

import "fmt"

func main() {

    var flags uint8 = 0
    
    // Set bits
    flags |= 1 << 0 // Set bit 0
    flags |= 1 << 2 // Set bit 2
    
    fmt.Printf("Flags: %08b\n", flags)
    
    // Check bits
    if flags & (1 << 2) != 0 {
        fmt.Println("Bit 2 is set")
    }
    
    // Clear bits
    flags &^= 1 << 0 // Clear bit 0
    fmt.Printf("Flags after clear: %08b\n", flags)
    
    // Toggle bits
    flags ^= 1 << 3 // Toggle bit 3
    fmt.Printf("Flags after toggle: %08b\n", flags)
}

该示例演示了在 uint8 值中设置、检查、清除和切换单个位。这对于紧凑的标志存储非常有用。

来源

Go 语言规范

本教程通过声明、算术、溢出处理和位操作的实际示例,涵盖了 Go 中的 `uint8` 类型。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Golang 教程