浅谈Go与习题(三十一)

160 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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面试中会出现的问题,接下来会继续分享其他的习题的相关知识,对于一个刚入门的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!