Sobes.tech
Junior — Middle

Ako prebieha konverzia dĺžky slice na jej skutočnú veľkosť v pamäti?

sobes.tech AI

Odpoveď od AI

V jazyku Go je rez (slice) štruktúra, ktorá obsahuje:

  • ukazovateľ na pole,
  • dĺžku (len),
  • kapacitu (cap).

Dĺžka rezu je počet prvkov, ktoré obsahuje, a skutočná veľkosť v pamäti závisí od kapacity a veľkosti typu prvkov.

Napríklad, ak máte rez typu int (zvyčajne 8 bajtov na prvok) s dĺžkou 5 a kapacitou 10, tak je v pamäti rezervované miesto pre 10 prvkov (80 bajtov), hoci dĺžka je 5.

Veľkosť rezu v pamäti = sizeof(prvok) * cap.

Ukážkový 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)))
}