Golang uint 类型
最后修改时间 2025 年 5 月 8 日
本教程将讲解如何在 Go 中使用 `uint` 内置类型。我们将通过 uint 使用的实际示例,介绍无符号整数基础知识。
Go 中的 `uint` 类型代表无符号整数。与有符号整数不同,uint 值始终为正数。在相同的位数下,它们提供了比其有符号对应类型更大的正数值范围。
在 Go 中,`uint` 是与架构相关的,匹配 32 位或 64 位。对于特定大小,请使用 uint8、uint16、uint32 或 uint64。Uint 值不能表示负数。
基本的 uint 声明和用法
`uint` 最简单的用法是声明正数变量。此示例展示了基本的 uint 声明和算术运算。
注意: Uint 非常适合用于计数、大小和索引。
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 类型及其最大值。
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 索引进行安全的数组访问。
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 值的常用位操作技术。
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 在文件大小和内存地址方面的用法。
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 中的 `uint` 类型。