Reading关于Golang中的数组和切片。
为什么使用像len
和cap
这样的内置函数而不是切片对象上的类似方法?
if cap(slice) == len(slice) {
fmt.Println("slice is full!")
}
VS
if slice.cap() == slice.len() {
fmt.Println("slice is full!")
}
为什么要污染全局命名空间?为什么不使用面向对象的风格?
此外,是否存在这样的方法,是否可以使用它们代替内置函数?
答案 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
之类的简写,编译器会理解并相应地优化它。