ZetCode

Golang len 函数

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

本教程将介绍如何在 Go 中使用内置的 len 函数。我们将通过不同数据类型的实际示例来讲解基本用法。

len 函数用于获取 Go 中各种类型的长度。它可用于字符串、数组、切片、映射和通道。返回值始终是一个 int,表示元素的数量。

在 Go 中,len 是一个内置函数,它提供了一种跨不同数据结构衡量大小的一致方法。对于数组,它在编译时进行评估;对于切片等动态类型,它在运行时进行评估。

基本字符串长度示例

len 最简单的用法是测量字符串的字节长度。此示例演示了基本的字符串长度计算。
注意: 对于 Unicode 字符串,len 计算的是字节数,而不是字符数。

string_len.go
package main

import "fmt"

func main() {
    str := "Hello, 世界"
    
    fmt.Println("String:", str)
    fmt.Println("Length in bytes:", len(str))
    
    // To count runes (Unicode code points) instead:
    fmt.Println("Length in runes:", len([]rune(str)))
}

字符串包含 ASCII 和 Unicode 字符。由于非 ASCII 字符的 UTF-8 编码,字节长度与字符数不同。

数组和切片长度

我们可以使用 len 来获取数组和切片的长度。此示例展示了静态和动态集合的长度计算。

array_slice_len.go
package main

import "fmt"

func main() {
    // Array (fixed size)
    arr := [5]int{1, 2, 3, 4, 5}
    fmt.Println("Array length:", len(arr))
    
    // Slice (dynamic size)
    slice := []int{1, 2, 3}
    fmt.Println("Initial slice length:", len(slice))
    
    // Append elements
    slice = append(slice, 4, 5)
    fmt.Println("Updated slice length:", len(slice))
}

数组长度保持不变,而切片长度会随着元素的添加而改变。两者都使用相同的 len 函数语法。

映射长度

len 函数可与映射一起使用,以计算键值对的数量。此示例显示了修改前后映射长度的计算。

map_len.go
package main

import "fmt"

func main() {
    colors := map[string]string{
        "red":   "#FF0000",
        "green": "#00FF00",
        "blue":  "#0000FF",
    }
    
    fmt.Println("Initial map length:", len(colors))
    
    // Add a new entry
    colors["white"] = "#FFFFFF"
    fmt.Println("After addition:", len(colors))
    
    // Delete an entry
    delete(colors, "green")
    fmt.Println("After deletion:", len(colors))
}

映射长度会随着键值对的添加或删除而改变。len 函数提供映射中当前元素的计数。

通道长度

对于通道,len 返回队列中元素的数量。此示例演示了通信过程中通道长度的测量。

channel_len.go
package main

import "fmt"

func main() {
    ch := make(chan int, 3)
    
    fmt.Println("Empty channel length:", len(ch))
    
    ch <- 1
    ch <- 2
    fmt.Println("After two sends:", len(ch))
    
    <-ch
    fmt.Println("After one receive:", len(ch))
    
    close(ch)
}

通道长度反映了缓冲区中当前元素的数量。这对于监控并发程序中的通道使用情况很有用。

具有 Len 方法的自定义类型

虽然 len 可与内置类型一起使用,但我们可以为自定义类型实现自己的 Len 方法。此示例同时展示了这两种方法。

custom_len.go
package main

import "fmt"

type Queue struct {
    elements []int
}

func (q *Queue) Len() int {
    return len(q.elements)
}

func main() {
    q := Queue{elements: []int{1, 2, 3, 4}}
    
    // Using custom Len method
    fmt.Println("Queue length (method):", q.Len())
    
    // Using built-in len on the slice
    fmt.Println("Queue length (built-in):", len(q.elements))
}

自定义 Len 方法在内部使用内置的 len 函数,提供了一个干净的接口。两种方法都得到相同的结果。

来源

Go 语言规范

本教程通过字符串、数组、切片、映射和通道的实际示例,介绍了 Go 中的 len 函数。

作者

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

列出所有 Golang 教程