Все встроенные функции на самом деле не функции.Это может быть куча других функций или просто одна инструкция asm (как в этом случае).
Вот структура слайса:
type SliceHeader struct {
Data uintptr // sizeof(uintptr) = 8 byte
Len int
Cap int
}
Чтобы получить len среза, мы должны получить смещение отуказатель среза.Go-идиоматический вариант выглядит следующим образом:
*(*int)(unsafe.Pointer(uintptr(pointer_to_slice) + 8))
Как видите, выходной код goasm для len (b) равен одной инструкции: 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
Итак, мыМожно сделать вывод, что создание новой переменной длины не влияет на производительность.