## 一、go struct能不能比较
~~~
因为是强类型语言,所以不同类型的结构不能作比较,但是同一类型的实例值是可以比较的,实例不可以比较,因为是指针类型
~~~
## 二、go defer(for defer),先进后出,后进先出
~~~
func b() {
for i := 0; i < 4; i++ {
defer fmt.Print(i)
}
}
~~~
## 三、select可以用于什么,常用语gorotine的完美退出
~~~
golang 的 select 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作
每个case语句里必须是一个IO操作,确切的说,应该是一个面向channel的IO操作
~~~
## 四、client如何实现长连接
~~~
server是设置超时时间,for循环遍历的
~~~
## 五、主协程如何等其余协程完再操作
~~~
1、使用channel进行通信,context,select
~~~
2、Go提供了更简单的方法——使用`sync.WaitGroup`。`WaitGroup`,就是用来等待一组操作完成的。`WaitGroup`内部实现了一个计数器,用来记录未完成的操作个数.
它提供了三个方法,`Add()`用来添加计数。`Done()`用来在操作结束时调用,使计数减一。`Wait()`用来等待所有的操作结束,即计数变为0,该函数会在计数不为0时等待,在计数为0时立即返回。
```
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
wg.Add(2) // 因为有两个动作,所以增加2个计数
go func() {
fmt.Println("Goroutine 1")
wg.Done() // 操作完成,减少一个计数
}()
go func() {
fmt.Println("Goroutine 2")
wg.Done() // 操作完成,减少一个计数
}()
wg.Wait() // 等待,直到计数为0
}
```
执行结果:
```
Goroutine 2
Goroutine 1
```
## 六、slice,len,cap,共享,扩容
~~~
append函数,因为slice底层数据结构是,由数组、len、cap组成,所以,在使用append扩容时,会查看数组后面有没有连续内存快,有就在后面添加,没有就重新生成一个大的素组
~~~
## 七、map如何顺序读取
~~~
map不能顺序读取,是因为他是无序的,想要有序读取,首先的解决的问题就是,把key变为有序,所以可以把key放入切片,对切片进行排序,遍历切片,通过key取值。
~~~
## 八、http get跟head
~~~
HEAD和GET本质是一样的,区别在于HEAD不含有呈现数据,而仅仅是HTTP头信息。有的人可能觉得这个方法没什么用,其实不是这样的。想象一个业务情景:欲判断某个资源是否存在,我们通常使用GET,但这里用HEAD则意义更加明确。
~~~
## 九、http 401,403
~~~
400 bad request,请求报文存在语法错误
401 unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息
403 forbidden,表示对请求资源的访问被服务器拒绝
404 not found,表示在服务器上没有找到请求的资源
~~~
## 十、http能不能一次连接多次请求,不等后端返回
~~~
http本质上市使用socket连接,因此发送请求,接写入tcp缓冲,是可以多次进行的,这也是http是无状态的原因
~~~
## 十一、tcp与udp区别,udp优点,适用场景
~~~
tcp传输的是数据流,而udp是数据包,tcp会进过三次握手,udp不需要
~~~
## 其他
[更多推荐](https://blog.csdn.net/ilini/article/details/107330173)
[更多推荐](https://zhuanlan.zhihu.com/p/434629143)
- 一、经典(一)
- 二、经典(二)
- 三、经典(三)
- 四、经典(四)
- 五、经典(五)
- 六、经典(六)
- 七、经典(七)
- 八、经典(八)
- 九、经典(九)
- 十、经典(十)
- 十一、经典(十一)
- 十二、经典(十二)
- 其他
- 1、知识点一
- 2、面试集
- 3、负载均衡原理
- 4、LVS相关了解
- 5、微服务架构
- 6、分布式锁实现原理
- 7、Etcd怎么实现分布式锁
- 8、Redis的数据结构有哪些,以及实现场景
- 9、Mysql高可用方案有哪些
- 10、Go语言的栈空间管理是怎么样的
- 11、Goroutine和Channel的作用分别是什么
- 12、Go中的锁有哪些?三种锁,读写锁,互斥锁,还有map的安全的锁?
- 13、怎么限制Goroutine的数量
- 14、Goroutine和线程的区别?
- 15、中间件原理