Go知识点

1、进程和线程的区别
答:计算机由CPU和操作系统组成,CPU执行计算任务,操作系统执行资源调度任务。在操作系统上会有很多软件可以执行,每个软件的执行系统都会单独分配资源,即一个独立的进程,进程和进程之间是相互独立的,每个进程有单独的分配内存空间,进程是系统进行资源分配和调度的一个独立单位。每个进程都至少有一个线程,线程执行代码程序,共享进程的数据资源,线程是轻量级的,有自己的堆栈、寄存器,共享进程空间,一个进程可以有多个线程,并发执行由CPU控制时间段,做上下文切换,上下文切换由调度器控制,在不同的时间段内执行不同的线程,每次上下文切换的时候都保存当前状态,下次回来时重新从中断点开始接着执行。线程切换是轻量级的,相对于进程切换消耗更少的资源。进程由内存空间(代码、数据、进程空间,打开的文件)和一个或者多个线程组成。一个标准的线程由线程ID,当前指令指针PC,寄存器和栈组成。线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位,线程是一个进程中代码的不同执行路线。

2、go的调度
答:go支持多线程,在代码中我们可以通过关键字go创建一个线程,多线程并发执行,由系统调度切换上下文,即在不同的时间段分间断的执行不同的线程内容;

3、go struct能不能比较
Go是强类型语言,不能隐性转换,不同类型不能比较。但同一类型的实例值可以比较的。实例不可以比较,因为是指在类型

4、go defer
先进后出,后进先出

5、select可以用于什么,常用语gorotine的完美退出
select是Go的一个控制结构,类似于用于通信的switch语句,每个case语句必须是一个通信操作,要么是发送要么是接收。select随机执行一个可运行的case.如果没有case可以运行,它将阻塞,直到有case可运行。一个默认的子句总是可运行的。select会循环检查条件,如果有满足则执行并退出,否则一直循环检测,阻塞运行,直到有case可以运行。

6、context包的用途Context通常被译作为上下文,它是一个比较抽象的概念,其本质是【上下上下】存在上下层的传递,上会把内容传递给下。在Go语言中,程序单元也就指的Goroutine
答:系统在做线程调度的时候,会将产生中断,保存当前线程状态,切出到其他线程,执行其他线程,之后返回这个中断的线程,取出数据继续执行该线程。多线程并发就是CPU的时间片段之行,CPU总是顺序执行任务的,要达到并发就要不断的在不同线程间快速切换,切换过程中就会有线程的中断,数据的保存,线程的重启,数据的重读,上下文就是线程的调度,中断线程,保存数据,重读数据,继续执行线程。

7、主协程如何等待其余协程操作完再执行
利用channl和select,select是Go的控制语句,类似于switch,每个case语句都是一个通信操作,发送或者接收。如果没有满足条件的case,select会一直循环监听,阻塞线程,直到有case语句被执行

8、slice,len,cap,共享,扩容
slice的数据结构由指向数组的指针、len,cap组成,在使用append扩容的时候,会查看有没有可用的连续内存,如果有直接添加,没有就重新组成一个大的数组,扩容总是cap的倍数执行,如果原切片的容量大于等于1024时,每次增加25%。扩容slice后,指向的数组的指针发生改变,已不再指向原数组

9、map如何顺序读取
map是无序的,不能顺序读取,如果想要顺序读取,先要将key顺序化。用切片将排序,再给map依次赋值

10、实现SET功能
// 实现set

type Set struct {
    sync.RWMutex
    v map[string]bool
}

func New() *Set {
    return &Set{
        sync.RWMutex{},
        map[string]bool{},
    }
}
// 不重复 添加
func (s *Set)AddItem(val string)  {
    s.Lock()
    defer s.Unlock()
    s.v[val] = true
}
// 删除
func (s *Set)RemoveItem(val string)  {
    s.Lock()
    defer s.Unlock()
    delete(s.v, val)
}

11、实现消息队列(多生产者,多消费者)
带缓存channel 队列结构,先进先出

12、大文件排序

归并排序,分而治之,拆分为小文件,在排序

13、基本排序,哪些是稳定的
快速排序,冒泡排序,插入排序

14 http中get和head的区别
head请求中信息放在请求投中,没有返回体,get可在请求链接中拼接参数,有请求信息返回。
用head请求可以判断某个资源是否存在

15 401,403,404,502,504错误
400:请求格式错误
401:用户无权限
403:拒绝访问
404:找不到服务
502:网关错误
504:服务器错误

16、http重连接机制 keep-alive
请求头中加入Connection: keep-alive来告诉对方这个请求响应完成后不要关闭,下一次咱们还用这个请求继续交流。

17、http能不能一次连接多次请求,不等后端返回
http本质上市使用socket连接,因此发送请求,接写入tcp缓冲,是可以多次进行的,这也是http是无状态的原因

18、主键索引和唯一索引的区别
主键是一种约束,唯一索引是索引,本质不同。主键创建时默认创建唯一索引。主键不能为空,主键可以当作外键,主键唯一。唯一索引可以创建多个

26、项目里的微信支付这块,在支付完微信通知这里,收到两次微信相同的支付通知,怎么防止重复消费
redis锁(setNX)
28、Go的反射包怎么找到对应的方法

29、Redis基本数据结构

31、Mysql的索引有几种,时间复杂度
4种,主键、唯一、普通、全文,B+树,时间复杂度O(logn)
32、InnoDb是表锁还是行锁,为什么
InnoDb即支持行锁,也支持表锁,只有在通过索引检索数据时使用行锁。

33、Go的channel(有缓冲和无缓冲)

34、退出程序时怎么防止无缓存的channel没有消费完
退出程序时将生产者关闭,不会有多余的数据给消费者消费

35、用过什么消息中间件之类吗?

38、生产者消费者模式,利用channel

var wg  sync.WaitGroup
// 生产者
func Send(ch chan int){
    x := 0
    defer func(){
        close(ch)
        wg.Done()
    }()
    for i:=0;i<10;i++{
            x++
            ch <-
    }
}
// 消费者
func Receive(ch chan int){
    defer func(){
        close(ch)
        wg.Done()
    }()
    for x := range ch {
        fmt.Println(x)
    }
}

func main(){
    ch := make(chan int)
    wg.Add(2)
    go Send(ch)
    go Receive(ch)
    wg.Wait()
    fmt.Println("任务完成")
}

39、手写循环队列

// 循环队列
type CircleQueue struct{
    queue []interface{}
    tail int
    front int
    cap int
}

// 创建循环对例
func NewCircleQueue(n int) *CircleQueue  {
    loop := &CircleQueue{
        make([]interface{},0,n),
        0,
        0,
        n,
    }
    return loop
}

// 添加元素
func (c *CircleQueue)AddQueue(a interface{}) bool {
    // 判断是否已经满了
    if c.front == (c.tail+1)%c.cap {
        return false
    }
    c.queue = append(c.queue,a)
    c.tail = (c.tail+1)%c.cap
    return true
}

// 删除元素
func (c *CircleQueue)DeleteQueue() bool {

    if c.tail == c.front {
        return false
    }
    c.queue = c.queue[c.front:]
    c.front = (c.front+1)%c.cap
    return true
}

// 获取长度
func (c *CircleQueue)Len()int {
    // 当c.tail == c.front时循环队列,不一定为空
    if c.tail == c.front && c.front != (c.tail+1)%c.cap{
        return 0
    }
    return c.tail - c.front
}

40、如何保证循环队列线程安全
1.可以加锁。2.channel本身是一个带锁的队列,可以将结构体中的切片换成带缓存的channel

42、Linux会不会,只会几个命令,一共也就一百多个命令

43、TimeWait和CloseWait原因

45、看过什么源码,nsq(Go的消息中间件)

46、sync.Pool用过吗,为什么使用,对象池,避免频繁分配对象(GC有关),那里面的对象是固定的吗

49、证明二叉树的叶子节点跟度数为2的节点的关系

50、唯一索引和主键索引

52、字符串解析为数字(考虑浮点型)

53、单点登录,tcp粘包

54、手写洗牌

56、goroutine调度用了什么系统调用

57、进程虚拟空间分布,全局变量放哪里

58、有没有网络编程,有,怎么看连接状态?netstat,有哪些?ESTABLISHED,LISTEN等等,有异常情况吗?TIME_WAIT很多,为什么?

59、几种基本排序算法说一下,问了堆的时间复杂度,稳定性,为什么不稳定
快速排序、冒泡排序、插入排序
61、什么是主键

62、联合索引和唯一索引

63、越多的索引越好吗?
不是,占用资源,插入性能差

64、建立索引要注意什么

65、死锁?

66、tcp三次握手

67、http,https

68、状态码401,301,302,201

69、项目我说只有一台机子,所以用的单机部署,面试官说单机也可以部署多个,有什么方法吗?我说docker,问docker有哪些网络,不熟,dockerfile关键字,只答几个。顺便扯了下nginx转发。

70、数据库隔离级别,提交读会造成什么

71、go调度

72、goroutine泄漏有没有处理,设置timeout,select加定时器

73、mysql高可用的方案
读写分离

75、排序算法以及时间复杂度

77、go的线程,给他讲了跟goroutine调度

78、io模型,同步阻塞,同步非阻塞,异步

79、cookie和session

80、接口kps测试

81、redis分布式,如何减少同步延迟

93、go优缺点

94、go的值传递和引用
天生指针类型:map、channel、slice
值类型:数组
Golang默认采用值传递,即拷贝传递
区别:
函数调用数组时,默认会是值传递,在函数内部修改数组值,外部数组内容不会改变
如果传入的是map,内部修改完后,外部也会改变

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342