golang面试题
第一篇:基础语法
- 数组和slice区别,slice扩容机制
- 说下Go的map底层实现
- map如何实现有序读取
map不能顺序读取,是因为他是无序的,想要有序读取,首先的解决的问题就是,把key变为有序,所以可以把key放入切片,对切片进行排序,遍历切片,通过key取值。
- 代码执行结果:
s := make([]int, 5)
s = append(s, 1, 2, 3)
fmt.Println(s)
- 代码执行结果:
p1 := 1
p2 := &p1
*p2++
fmt.Println(p1)
fmt.Println(*p2)
- 代码执行结果:
a := [3]int{0, 1, 2}
s := a[1:2]
s[0] = 11
s = append(s, 12)
s = append(s, 13)
s[0] = 21
fmt.Println(a)
fmt.Println(s)
- 代码执行结果:
var a = [5]int{1, 2, 3, 4, 5}
var r [5]int
for i, v := range &a {
if i == 0 {
a[1] = 12
a[2] = 13
}
r[i] = v
}
fmt.Println("r = ", r)
fmt.Println("a = ", a)
- 切片的反转
s:= []int{1,2,3,5,4} - 代码执行结果
const (
x = iota
_
y
z = "zzz"
k
p = iota
)
func main() {
fmt.Println(x,y,z,k,p)
}
- 代码执行结果
slice := []int{10, 11, 12, 13}
m := make(map[int]*int)
for key, val := range slice {
m[key] = &val
}
fmt.Println(m)
for k, v := range m {
fmt.Println(k, "->", *v)
}
- 代码执行结果
func test(x int) (func(), func()) {
return func() {
println(x)
x += 10
}, func() {
println(x)
}
}
func main() {
foo, bar := test(10)
foo()
bar()
}
- new() 与 make() 的区别
- golang变量内存分配,什么时候分配在栈,何时分配在堆
- golang哪些类型是指传递,哪些是引用传递,区别是什么,分别的使用的场景
- 代码执行结果
package main
import "fmt"
func main() {
c := make(chan int)
for i := 0; i <= 10; i++ {
c <- i
}
go func() {
for item := range c {
fmt.Println(item)
}
}()
}
- 怎么安全的使用全局变量
- 闭包,把全局变量当作闭包函数的局部变量,返回一个函数,程序使用这个函数来安全的使用这种全局变量
- golang的接口原理,怎么用,接口的作用
- Golang的内存分配和内存管理
- context包的用途
第二篇:计算机网络&并发
- OSI七层模型
- DNS协议详细过程【or 向浏览器里面输入一个网址,过程是怎么样的? (DNS,TCP)】
- ip查mac地址是什么协议?(ARP)
- http和https的区别
- 细说下https实现过程【先非对称加密然后对称加密,ssl协议】
- TCP三次握手过程?
- TCP和UDP的区别?
- 为什么音视频传输使用UDP协议?
- TCP四次挥手后,为什么要time_wait 2MSL?等1MSL为啥不可以?
- 既然TCP有seq,Time_wait这个状态有啥用呢?没有行不行?
- TCP的特性(超时重传、滑动窗口、流量控制、拥塞控制)
- http keep-alive
client发出的HTTP请求头需要增加Connection:keep-alive字段
Web-Server端要能识别Connection:keep-alive字段,并且在http的response里指定Connection:keep-alive字段,告诉client,我能提供keep-alive服务,并且"应允"client我暂时不会关闭socket连接
- 线程,协程,进程的区别?
- 互斥锁,读写锁应用什么场景
- 简单说一下GMP模型
- channel的作用,在Go里面有什么使用场景?
- channel关闭了去读去写会怎样?
- IO模型,同步阻塞,同步非阻塞,IO多路复用,异步
- IO多路复用简单介绍下,其中epoll和poll的区别
- goroutine泄露怎么排查
- 主协程如何等其余协程完再操作【使用channel进行通信,context,select 】
第三篇:框架
- gin框架
- Go-zero
- micro框架
第四篇:数据库
4.1 、MySQL
- mysql的不同索引类型
- mysql有几种日志,binlog什么情况可以产生,主要是干嘛用的
重做日志(redo log)
回滚日志(undo log)