Junior — Middle
Hogyan történik a szelet hosszának átalakítása a memória szerinti tényleges méretre?
sobes.tech MI
Válasz az MI-től
Go-ban a szelet (slice) egy olyan szerkezet, amely tartalmaz:
- egy mutatót egy tömbre,
- a hosszát (len),
- a kapacitását (cap).
A szelet hosszúsága az elemek számát jelenti, amelyeket tartalmaz, és a memória tényleges mérete a kapacitástól és az elemtípus méretétől függ.
Például, ha van egy int típusú szelet (általában 8 byte elemenként) hosszúsága 5 és kapacitása 10, akkor a memóriában hely van foglalva 10 elem számára (80 byte), bár a hossz 5.
A szelet memória mérete = sizeof(elem) * cap.
Demonstrációs kód:
package main
import (
"fmt"
"unsafe"
)
func main() {
s := make([]int, 5, 10)
fmt.Println("len:", len(s))
fmt.Println("cap:", cap(s))
fmt.Println("size in bytes:", unsafe.Sizeof(s[0])*uintptr(cap(s)))
}