文章作者: Daoji
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 盗计のBlog!
相关推荐
2023-06-19
Golang面试题详解(一):数组、切片、Channel与继承
Golang题库(一)golang里的数组和切片有了解过吗?值传递和引用传递在函数传参中,数组是值传递,切片则是引用传递。即函数内修改数组,外不变,而切片则相反。 逻辑运算数组能比较大小,切片则只能与nil比较。 容量和长度数组是连续地址的储存相同类型元素的序列,初始化容量之后,不可变。 切片是指向数组的拥有相同类型元素的可变长序列,可以扩容和传递,比数组更加灵活。 Go切片(slice)的实现可以在源码包src/runtime/slice.go中找到。在源码中,slice的数据结构定义如下。 12345type slice struct { array unsafe.Pointer //指向底层数组的指针 len int //切片长度 cap...
2023-06-27
Golang面试题详解(七):Slice底层、线程安全Map、锁与Map实现
Golang题库(七)Slice 与 Array, Append()Array数组(Array)是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。因其长度的不可变动,数组在Go中很少直接使用。把一个大数组传递给函数会消耗很多内存。一般采用数组的切片 几种初始化方式 123arr1 := [3]int{1, 2, 3}arr2 := [...]int{1, 2, 3}arr3 := [3]int{0:3,1:4} SliceSlice是一种数据结构,描述与Slice变量本身分开存储的Array的连续部分。 Slice不是Array。Slice描述了Array的一部分。 slice底层是一个struct 123456// runtime/slice.gotype slice struct { array unsafe.Pointer// 指向数组的指针 len int cap ...
2023-06-22
Golang面试题详解(三):Channel与锁、应用场景及Slice与Array深度对比
Golang题库(三)同一个协程里面,对无缓冲channel同时发送和接收数据有什么问题 同一个协程里,不能对无缓冲channel同时发送和接收数据,如果这么做会直接报错死锁。 对于一个无缓冲的channel而言,只有不同的协程之间一方发送数据一方接受数据才不会阻塞。channel无缓冲时,发送阻塞直到数据被接收,接收阻塞直到读到数据。 channel和锁的对比作用区别 Channel是用于处理协程中的数据通信问题的,通过编程逻辑设计,可以实现锁的效果。 Mutex是用于控制原子性操作数据安全性,通过加锁和释放确保区间内数据只能有单一协程访问。数据一致性。 两者的用途不同 两者内存占用也不同 channel的应用场景channel用于协程之间数据通信,根据设计能够实现多种功能。 任务超时与取消通过在通道中传递信号,可以实现任务的超时和取消机制。例如,一个 goroutine 可以在执行耗时操作时启动一个定时器,如果操作在指定时间内未完成,可以通过通道发送取消信号给其他 goroutine,从而取消操作。 比如超时处理: 12select { case...
2023-07-04
Golang面试题详解(九):内存模型、深浅拷贝与并发安全
Golang题库(九)怎么用go实现一个栈12345678910111213141516171819202122232425262728293031323334353637383940//一个队列type MyStack struct { queue []int}func Constructor() MyStack { return MyStack{ queue: make([]int, 0), }}func (this *MyStack) Push(x int) { this.queue = append(this.queue, x)}func (this *MyStack) Pop() int {//出队操作 n := len(this.queue)-1 for n!=0{ ////除了最后一个,其余的都重新添加到队列里 val := this.queue[0] this.queue =...
2023-06-20
Golang面试题详解(二):GMP模型、Channel底层原理及Go与Java对比
Golang题库(二)数组怎么转集合?无法直接转换,需要通过遍历数组,构造一个map。例如: 12345678func main() { arr := [5]int{1, 2, 3, 4, 5} m := make(map[int]int, 5) for i, v := range arr { m[i] = v } fmt.Println(m)} ⭐Go的GMP模型?G是Goroutine的缩写,相当于操作系统的进程控制块(process control block)。它包含:函数执行的指令和参数,任务对象,线程上下文切换,字段保护,和字段的寄存器。 M是一个线程,每个M都有一个线程的栈。如果没有给线程的栈分配内存,操作系统会给线程的栈分配默认的内存。当线程的栈制定,M.stack->G.stack,...
2023-06-25
Golang面试题详解(五):热部署、读写锁、Goroutine与线程
Golang题库(五)go 实现不重启热部署根据SIGHUP 信号量根据系统的 SIGHUP 信号量,以此信号量触发进程重启,达到热更新的效果。 热部署我们需要考虑几个能力: 新进程启动成功,老进程不会有资源残留 新进程初始化的过程中,服务不会中断 新进程初始化失败,老进程仍然继续工作 同一时间,只能有一个更新动作执行 监听信号量的方法的环境是在 类 UNIX 系统中,在现在的 UNIX 内核中,允许多个进程同时监听一个端口。在收到 SIGHUP 信号量时,先 fork 出一个新的进程监听端口,同时等待旧进程处理完已经进来的连接,最后杀掉旧进程。 使用air包air包可以实现插件化热更新的方案,集成方便,非常适用于小型项目的开发。 ⭐saas灰度发布介绍灰度发布常见有三种模式金丝雀发布、滚动发布、蓝绿发布。灰度发布主要是更新服务中,通过服务的多节点、多切片进行无感知的服务更新迭代。阿里云、AWS等云平台都已支持灰度发布功能。 实现灰度发布主要是通过网关转发的均衡负载,确保服务更新过程中能够不停机、无感知、可回溯。常见的灰度发布实现方案有Nginx +Lua + Redis...
评论
公告
This is my Blog