go-面试技术点-带解析

1. go语言slice底层实现原理

Slice切片的数据结构

切片 通过指针引用底层数组,设定相关属性将数据读写操作限定在指定的区域内。
切片本身是一个只读对象,其工作机制类似数组指针的一种封装。

切片是一个长度可变的数组。
切片的结构体由3部分构成,Pointer 是指向一个数组的指针,len 代表当前切片的长度,cap 是当前切片的容量。cap 总是大于等于 len 的

Go 中切片扩容的策略是这样的:

在 1.18 版本前,切片扩容,在容量小于1024时,以2倍大小扩容。超过1024后,以1.25倍扩容。
在扩容后切片的基础上,会根据长度和容量进行 roundupsize 。

在1.18版本后,切片扩容,在容量小于256时,以2倍大小扩容。超过256后,以(1.25倍+192)扩容。

什么时候生成了新的切片?

是因为原来数组的容量已经达到了最大值,再想扩容, Go 默认会先开一片内存区域,把原来的值拷贝过来,然后再执行 append() 操作。这种情况丝毫不影响原数组。
所以建议尽量避免情况一,尽量使用情况二,避免 bug 产生。

2. Map是什么

map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。

结构上类似json

map类型的变量默认初始值为nil,需要使用make()函数来分配内存。语法为:

   make(map[KeyType]ValueType, [cap])

2. map底层实现原理:

最通俗的话说Map是一种通过key来获取value的一个数据结构,其底层存储方式为数组,在存储时key不能重复,当key重复时,value进行覆盖,我们通过key进行hash运算(可以简单理解为把key转化为一个整形数字)然后对数组的长度取余,得到key存储在数组的哪个下标位置,最后将key和value组装为一个结构体

3. map进行有序的排序

map 默认是无序的,不管是按照 key 还是按照 value 默认都不排序。

如果你想为 map 排序,需要将 key(或者 value)拷贝到一个切片,再对切片排序,然后可以使用切片的 for-range 方法打印出所有的 key 和 value

就是把map的key 拿出来放一个 list 切片,单独排序。用的时候,按照list 切片去取

4. 结构体不加tag可以转json字符串吗

如果变量首字母小写,则为private。无论如何不能转,因为取不到反射信息。
如果变量首字母大写,则为public。
不加tag,可以正常转为json里的字段,json内字段名跟结构体内字段原名一致。
加了tag,从struct转json的时候,json的字段名就是tag里的字段名,原字段名已经没用。

5. go语言tcp udp具体实现原理

tcp,开启服务端,挂一个监听服务即可。 read接信息,write 发信息
www.jb51.net/article/260186.htm

udp: 建立UDP服务端, net.ListenUDP . 不需要建立连接,直接收发数据

// 建立UDP服务端 ,不需要使用accept方法
    conn, err := net.ListenUDP("udp", &net.UDPAddr{
        IP:   net.IPv4(127, 0, 0, 1),
        Port: 40000,
    })
    if err != nil {
        fmt.Println("listen UDP failed,err:", err)
        return
    }
    defer conn.Close()

    // 不需要建立连接,直接收发数据

6. go语言协程调度原理,协程为什么快

oroutine的理解:
​ 是一种轻量级的用户态线程(可以避免用户态到核心态的切换,节省资源开销),由Go运行时调度器进行管理!在Go中,每一格协程都会被分配一个较小的栈空间(默认为2KB),并以非常低的成本创建和销毁。
​ 当一个协程阻塞时,调度器会自动将其与当前协程解除绑定,并将其转移到等待队列中,然后运行其它的协程,从而实现了高效地利用了CPU的时间片。

Go中协程的优势:
​ 协程不像传统多线程编程那样必须避免线程竞争和加锁解锁等操作。事实上,在Go中通常通过channel实现协程之间的同步和通信。Go的channel机制提供了一种非常有效且安全的协程同步方式,可以避免竞争条件和死锁等问题。同时,协程可以自我调节、自我管理,从而可以避免了频繁的线程切换带来的性能损耗。这使得协程同游非常快的相应速度和高效的并发处理能力。

​ 总而言之:Go 的协程是一种轻量级、高效率的并发编程方式,得益于其独特的调度机制和 channel 通信机制,可以有效地利用 CPU 时间片,并具有比传统多线程编程更加安全和高效的优点。

运行图补充:
Goroutine的运行时:
​ Go运行时调度器采用了M:N的模型,也就是在M个操作系统线程上运行N个协程。具体来说,Go运行时初始化了一个或多个GOMAXPROCS指定数量的操作系统线程,并在这些线程上运行协程。

go-面试技术点-带解析

【M(左):N(中)模型图】

7. go语言常见的一些算法(查找算法)

www.jianshu.com/p/49335969cfd4

8. mysql索引分为几种(b+tree hash表)

  1. 索引按照存储结构划分为4类: B Tree(B-tree)、Hash、R-Tree、 Fulltext(MyISAM)

  2. 也可分为聚集索引和非聚集索引

    聚簇索引和非聚簇索引的区别?

聚簇索引: 聚簇索引是顺序结构与数据存储物理结构一致的一种索引,并且一个表的聚簇索引只能有唯一的一条;

说明:    
    平时习惯逛图书馆的童鞋可能比较清楚,如果你要去图书馆借一本书,最开始是去电脑里面查书名然后根据书名来定位藏书在那个区,哪个书柜,哪一行,第多少本。。。清晰明确,一目了然,因为藏书的结构与图书室的位置,书架的顺序,书本的摆放顺序与书籍的编号都是从大到小一致的顺序摆放的,所以很容易找到。比如,你的目标藏书在C235仓,那么你走到B区你就很快知道前面就快到了C区了,你直接奔着2柜区就能找到了。 这就是雷同于聚簇索引的功效了,聚簇索引,实际存储的循序结构与数据存储的物理机构是一致的,所以通常来说物理顺序结构只有一种,那么一个表的聚簇索引也只能有一个,通常默认都是主键,设置了主键,系统默认就为你加上了聚簇索引,当然有人说我不想拿主键作为聚簇索引,我需要用其他字段作为索引,当然这也是可以的,这就需要你在设置主键之前自己手动的先添加上唯一的聚簇索引,然后再设置主键,这样就木有问题啦。
非聚簇索引:    非聚簇索引记录的物理顺序与逻辑顺序没有必然的联系,与数据的存储物理结构没有关系;一个表对应的     

非聚簇索引可以有多条,根据不同列的约束可以建立不同要求的非聚簇索引;
说明:

    同样的,如果你去的不是图书馆,而是某城市的商业性质的图书城,那么你想找的书就摆放比较随意了,由于商业图书城空间比较紧正,藏书通常按照藏书上架的先后顺序来摆放的,所以如果查询到某书籍放在C235仓,但你可能要绕过F区,而不是A.B.C.D...连贯一致的,也可能同在C区的2柜,书柜上第一排是计算机类的书记,也可能最后一排就是医学类书籍;

9. redis比mysql好在哪里

持久化,数据类型多,支持数据备份

详情如下:
开源 先进的key-value存储 - 远程字典服务器 内存级数据库 数据结构服务器 - 一个基于内存的网络存储系统 五种数据类型 字符串(String), 哈希(hash), 列表(list), 集合(sets) 和 有序集合(sorted sets) 三个特点: Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存 储。 Redis支持数据的备份,即master-slave模式的数据备份。

10. es具体的使用方法好在哪里

原文: www.liwenzhou.com/posts/Go/elastic...

首先概念上来说
go-面试技术点-带解析

其次使用方法:
index PUT delete post get
type put
document put post 删除 delete
文档在ES服务中的唯一标志,_index, _type, _id 三个内容为组合,来锁定一个文档,操作抑或是修改。PUT要指定id,不然会失败;POST则不用

查询 可以通过id 查询,范围查询,wildcard查询,通配查询,与mysql中的like查询是一样的
还支持,正则regexp查询,支持分页查询等。
当然也支持高级复合查询,统计等等

11. 400 401 402 403 404状态码

400 Bad Request

1、语义有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求。

2、请求参数有误。

401 Unauthorized

当前请求需要用户验证。

402 Payment Required

此响应码保留以便将来使用,用于数字支付系统,然而现在并未使用。

403 Forbidden

服务器已经理解请求,但是拒绝执行它

404 Not Found

请求失败,请求所希望得到的资源未被在服务器上发现。

本作品采用《CC 协议》,转载必须注明作者和本文链接
嗨,我是波波。曾经创业,有收获也有损失。我积累了丰富教学与编程经验,期待和你互动和进步! 公众号:上海PHP自学中心 付费知识星球:破解面试:程序员的求职导师
讨论数量: 2

切片扩容策略在1.18改了,不再以1024作为基准线了。

11个月前 评论
wangchunbo (楼主) 11个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
司机 @ 欣昊玉
文章
273
粉丝
339
喜欢
558
收藏
1106
排名:64
访问:12.2 万
私信
所有博文
社区赞助商