ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 一、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)