ZetCode

Golang uint 类型

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

本教程将讲解如何在 Go 中使用 `uint` 内置类型。我们将通过 uint 使用的实际示例,介绍无符号整数基础知识。

Go 中的 `uint` 类型代表无符号整数。与有符号整数不同,uint 值始终为正数。在相同的位数下,它们提供了比其有符号对应类型更大的正数值范围。

在 Go 中,`uint` 是与架构相关的,匹配 32 位或 64 位。对于特定大小,请使用 uint8、uint16、uint32 或 uint64。Uint 值不能表示负数。

基本的 uint 声明和用法

`uint` 最简单的用法是声明正数变量。此示例展示了基本的 uint 声明和算术运算。
注意: Uint 非常适合用于计数、大小和索引。

basic_uint.go
package main

import "fmt"

func main() {

    var a uint = 42
    var b uint = 13
    
    sum := a + b
    diff := a - b
    product := a * b
    
    fmt.Println("Sum:", sum)
    fmt.Println("Difference:", diff)
    fmt.Println("Product:", product)
    
    // Division with uint
    quotient := a / b
    remainder := a % b
    fmt.Println("Quotient:", quotient)
    fmt.Println("Remainder:", remainder)
}

该示例演示了 uint 值的基本算术运算。所有运算都产生 uint 结果。减法产生的负结果将发生溢出。

Uint 大小变体

Go 提供了不同大小的 uint 类型。此示例展示了不同的 uint 类型及其最大值。

uint_sizes.go
package main

import (
    "fmt"
    "math"
)

func main() {

    var u8 uint8 = math.MaxUint8
    var u16 uint16 = math.MaxUint16
    var u32 uint32 = math.MaxUint32
    var u64 uint64 = math.MaxUint64
    
    fmt.Println("uint8 max:", u8)
    fmt.Println("uint16 max:", u16)
    fmt.Println("uint32 max:", u32)
    fmt.Println("uint64 max:", u64)
    
    // Platform-dependent uint size
    var u uint = math.MaxUint
    fmt.Println("uint max (platform dependent):", u)
}

每个 uint 类型都有一个特定的最大值。普通的 `uint` 类型匹配平台的字长。数学常量有助于确定最大值。

Uint 在数组索引中的应用

Uint 值通常用于数组和切片索引。此示例演示了使用 uint 索引进行安全的数组访问。

uint_indexing.go
package main

import "fmt"

func main() {

    data := []string{"apple", "banana", "cherry", "date"}
    
    // Using uint for indices
    var index uint = 2
    fmt.Println("Element at index", index, ":", data[index])
    
    // Safe iteration with uint
    for i := uint(0); i < uint(len(data)); i++ {
        fmt.Printf("data[%d] = %s\n", i, data[i])
    }
    
    // Converting between int and uint
    intIndex := 3
    uintIndex := uint(intIndex)
    fmt.Println("Converted index access:", data[uintIndex])
}

Uint 索引可防止负值,这些负值会导致运行时 panic。该示例展示了安全的迭代以及 int 和 uint 之间的类型转换。

Uint 的位运算

Uint 类型非常适合进行位运算。此示例演示了 uint 值的常用位操作技术。

bitwise_uint.go
package main

import "fmt"

func main() {

    var flags uint8 = 0b10101010
    
    // Bitwise operations
    fmt.Printf("Original: %08b\n", flags)
    fmt.Printf("AND with 0xF0: %08b\n", flags & 0xF0)
    fmt.Printf("OR with 0x0F: %08b\n", flags | 0x0F)
    fmt.Printf("XOR with 0xFF: %08b\n", flags ^ 0xFF)
    fmt.Printf("NOT: %08b\n", ^flags)
    
    // Bit shifting
    fmt.Printf("Left shift by 2: %08b\n", flags << 2)
    fmt.Printf("Right shift by 2: %08b\n", flags >> 2)
    
    // Bit setting and clearing
    mask := uint8(1 << 3)
    flags |= mask // Set bit 3
    flags &^= mask // Clear bit 3
}

Uint 类型支持所有位运算。该示例展示了 AND、OR、XOR、NOT 和移位操作。通过 uint 类型进行位操作非常精确。

Uint 在系统编程中的应用

Uint 类型对于系统级编程至关重要。此示例展示了 uint 在文件大小和内存地址方面的用法。

system_uint.go
package main

import (
    "fmt"
    "os"
    "unsafe"
)

func main() {

    // File size typically uses uint64
    fileInfo, _ := os.Stat("example.txt")
    fileSize := uint64(fileInfo.Size())
    fmt.Println("File size:", fileSize, "bytes")
    
    // Memory address demonstration
    var x int = 42
    addr := uintptr(unsafe.Pointer(&x))
    fmt.Printf("Memory address: 0x%x\n", addr)
    
    // System constants often use uint
    const pageSize uint = 4096
    memory := uint(16 * 1024 * 1024 * 1024) // 16GB
    pages := memory / pageSize
    fmt.Println("Total pages:", pages)
}

系统编程通常需要 uint 来表示大小和地址。该示例展示了文件大小处理、内存寻址和页面计算。Uint 可确保这些系统指标值为正数。

来源

Go 语言规范

本教程通过在各种上下文中无符号整数使用情况的实际示例,涵盖了 Go 中的 `uint` 类型。

作者

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

列出所有 Golang 教程