0%

Go面试问题

1. Slice 扩容机制

  • 当 newLen >= 2 * cap, 则 newCap = newLen

  • 当 newLen < 2 * cap

    • 如果 cap < 256, 则 newCap = 2 * cap
    • 如果 cap >= 256, 则 newCap = cap + (cap + 3 * threshold) / 4, 即 1.25 倍容量+ 0.75 倍阈值的平滑因子, 平滑因子在各个阈值阶段也会不同
      starting cap growth factor
      256 2.0
      512 1.63
      1024 1.44
      2048 1.35
      4096 1.30

2. 结构体所占字节长度怎么计算

可以使用unsafe包中的Sizeof函数来计算结构体所占字节长度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main

import (
"fmt"
"unsafe"
)

// 结构体内存对齐长度是按结构体中最长字段对齐,如下为int64 - 8字节
// |up| |down|down|score|score|score|score|id|id|id|id|id|id|id|id|
type Student struct {
Up int8
Down int16
Score int32
Id int64
}

func main() {
s := Student{-1, 1, 98, 123456}
fmt.Printf("unsafe.Sizeof(s): %v\n", unsafe.Sizeof(s))
}

output

1
unsafe.Sizeof(s): 16