len()函数原理
当调用len()
函数时,它根据参数的类型来返回不同的结果:
- 字符串(string): 返回字符串中的字节数(按字节计算)。
- 数组(array)和切片(slice): 返回数组或切片中的元素个数。
- 映射(map): 返回映射中键值对的数量。
- 通道(channel): 返回当前通道中待处理的元素个数。
在Go语言中,len()
函数的原理是通过查看不同类型对象的底层数据结构或属性,来确定长度或元素个数。对于大多数类型,len()
函数的计算都是基于底层数据结构直接访问,因此执行速度高效。
对于字符串,len()
函数返回的是字符串中的字节数,而不是字符数。Go语言中的字符串是以UTF-8编码的字节数组表示的,因此使用len()
函数计算的是字符串所占用的字节数。
对于数组和切片,它们虽然底层都是字节数组,但len()
函数的行为是相同的。len()
函数返回数组或切片中的元素个数。这是因为数组和切片在内存中是连续存储的,所以可以通过计算内存块的大小来确定元素的个数。
总结来说,len()
函数是Go语言的一个内置函数,用于返回不同类型对象的长度或元素个数。它的原理是根据不同的参数类型来计算长度,并且在大多数情况下都具有高效的执行速度。
测试代码:
func TestLen(t *testing.T) {
s := "string"
sZh := "你好"
ints := make([]int, 5)
ints = append(ints, 2)
c := make(chan int, 2)
fmt.Printf("len of s:%v\n", len(s)) // len of s:6
fmt.Printf("len of sZh:%v\n", len(sZh)) // len of sZh:6
fmt.Printf("len of ints:%v\n", len(ints)) // len of ints:6,说明一个中文占3个字节
fmt.Printf("cap of ints:%v\n", cap(ints)) // cap of ints:10
fmt.Printf("len of channel c:%v\n", len(c)) // len of channel c:0
fmt.Printf("cap of channel c:%v\n", cap(c)) // cap of channel c:2
c <- 1
fmt.Printf("len of channel c:%v\n", len(c)) // len of channel c:1
go func() {
num := <-c
fmt.Printf("num from channel:%v\n", num) // num from channel:1
}()
time.Sleep(3 * time.Second)
fmt.Printf("len of channel c:%v\n", len(c)) // len of channel c:0,读取后channel待处理元素为0个
}