翼健面试

一面

两人面:一个问go,一个问py+cpp。主要回答go。

basic

自我介绍

new 和 make的区别

切片和数组的区别

map的底层实现

channel的用法,使用场景

go的协程栈初始化大小

  • 每一个协程都会有自己的栈空间,用于存储局部变量、函数调用信息以及执行的上下文
  • 在go的1.14之前,每个新创建的协程栈空间是2KB。从1.14以后,这个大小增加到了8KB。这个增加是为了适应更复杂的和更大的应用程序,提供更多的栈空间以防止栈溢出

协程的扩容和缩容策略

go中的什么动作会涉及到runetime调度

内存逃逸是什么,什么场景会发生内存逃逸

编程部分

这样是否可行?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
type Person struct {
age int
}

func main() {

M := map[string]Person{}

M["Alice"] = Person{
age: 19,
}

M["Alice"].age = 20

}
//你得到的是该值的一个副本,而不是一个可修改的引用。

如何修改??

  • 先取值,再修改结构体,最终把结构体传入对应的map中
  • 使用指针

defer 相关

1
2
3
4
5
6
7
8
9
10
func main() {

var x = 1

defer func() {
println(x)
}()

x = 3
}

1
2
3
4
5
6
7
8
func main() {

var x = 1

defer println(x)

x = 3
}

二分查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/*
二分查找;

输入升序数组,且元素可重复,;
输出target的index,如有重复,则输出最靠前的index,如果没找到输出-1;
例:
输入:[0, 1, 2, 2, 2, 5, 6, 6, 8], target = 2
输出:2
*/

func binarySearch(arr []int, target int) int {
if arr == nil {
return -1
}
left, right := 0, len(arr)-1

for left <= right {
mid := left + (right-left)/2
if arr[mid] == target {
right = mid - 1
} else if arr[mid] >= target {
right = mid - 1
} else {
left = mid + 1
}
}
return left
}

反问环节

公司是搞卖 gpu资源 平台的

技术栈:go js py cpp


翼健面试
http://example.com/2024/03/31/翼健面试/
作者
Forrest
发布于
2024年3月31日
许可协议