切片中的长度和容量方法

时间:2014-03-31 17:53:27

标签: go

Reading关于Golang中的数组和切片。

为什么使用像lencap这样的内置函数而不是切片对象上的类似方法?

if cap(slice) == len(slice) {
    fmt.Println("slice is full!")
}

VS

if slice.cap() == slice.len() {
    fmt.Println("slice is full!")
}

为什么要污染全局命名空间?为什么不使用面向对象的风格?

此外,是否存在这样的方法,是否可以使用它们代替内置函数?

1 个答案:

答案 0 :(得分:2)

有一个FAQ entry on this,但这是我的看法:

len()cap()内置函数,因为编译器可以理解它们。你不能自己做替换 - 它们是方法不是核心语言的一部分,你不应该把它们与方法混淆。

在Go中,切片由三个部分组成,length, a capacity and a pointer to the underlying memory。例如reflect

的定义
type SliceHeader struct {
        Data uintptr
        Len  int
        Cap  int
}

所有len(x)都是从切片结构中读取的长度,因此它是x.Len之类的简写,编译器会理解并相应地优化它。