2 回答

TA貢獻1818條經驗 獲得超3個贊
這是我的理解:
你可以看作slice
是struct
其中的length
一員。
函數所做的唯一事情len()
就是讀取 的該成員type slice struct
,因此無需擔心其性能——它與讀取您length int
自己創建的成員一樣快。

TA貢獻1784條經驗 獲得超8個贊
所有內置函數實際上都不起作用。它可能是一堆其他函數或只是一個 asm 指令(就本例而言)。
這是切片結構:
type SliceHeader struct {
Data uintptr // sizeof(uintptr) = 8 byte
Len int
Cap int
}
要獲取切片的 len,我們應該獲取切片指針的偏移量。Go 慣用變體如下所示:
*(*int)(unsafe.Pointer(uintptr(pointer_to_slice) + 8))
可以看到,len(b)的輸出goasm代碼等于一條指令: https://godbolt.org/z/z0PtMe
var b1 = []byte{1, 2, 3}
var b2 = []byte{4, 5, 6}
func main() {
l1 := len(b1)
if len(b2) == l1 {
println(l1)
} else {
println(len(b2))
}
}
l1 := len(b1)
=
movq "".b1+8(SB), AX // ax == l1
但是,對于len(b2) == l1編譯器創建附加變量:
movq "".b2+8(SB), CX // cx == len(b2) in "if" statement
因此,我們可以得出結論,為長度創建新變量不會影響性能。
- 2 回答
- 0 關注
- 132 瀏覽
添加回答
舉報