开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 21 天,点击查看活动详情
今天来学习下Go常见的习题问题(三十一),也是面试中可能会遇到的,让我们来一起学习吧~
为什么Channel是线程安全的
因为channel可以看成是一个先进先出的队列,通过channel进行数据传递,发送数据到channel和从channel接收数据都是原子性操作,线程之间的通信可以通过共享内存,但这种是实现方式是需要加锁的,而channel是可以在多任务之间传递消息,本身就是安全的
map如何顺序读取
map本身不支持顺序读取,所以可以讲key值存入slice里,通过sort将切片排序,再通过key进行顺序读取map的值,如下代码所示:
package main
import (
"fmt"
"sort"
)
func main() {
var m = map[string]int{
"xiaoming": 0,
"xiaohong": 1,
"yyqq": 2,
"qqyy": 3,
}
var keys []string
for k := range m {
keys = append(keys, k)
}
sort.Strings(keys)
for _, k := range keys {
fmt.Println("Key:", k, "Value:", m[k])
}
}
http 4XX 状态码
- 400 bad request:客户端请求报文存在语法错误,笼统的错误
- 401 unauthorized:表示发送的请求需要有通过 HTTP 认证的认证信息
- 403 forbidden:对请求资源的访问被服务器拒绝,不是客户端的错误
- 404 not found:在服务器上没有找到请求的资源
接口nil比较
接口(interface)内部实现包含 2 个字段,动态类型T 和 动态值V,一个接口等于 nil的前提是,动态类型为nil,动态值为unset
两个接口值比较时,会先比较 动态类型,再比较 动态值,接口值与非接口值比较时,会先将非接口值尝试转换为接口值,再比较
func main() {
var p *int = nil
var i interface{} = p
fmt.Println(i == p) // true
fmt.Println(p == nil) // true
fmt.Println(i == nil) // false nil会转化为接口 T = nil v = nil 动态类型不相等
}
总结
今天浅谈了Go的习题(三十一),主要介绍了GO面试中会出现的问题,接下来会继续分享其他的习题的相关知识,对于一个刚入门的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!