Golang开发新手常犯的50个错误_gezhonglei2007的博客-CSDN博客
一些题目整理,附带大佬的解释
1.go中哪些值不能寻址&
常量(const常量,字面值3.14,字符串“xxx”,函数或方法, map的val值)
golang中接口的值为什么是不可寻址的,以及golang中哪些是不可取址的_golang 不可寻址-CSDN博客
2.range的一个返回值和两个返回值
3.有缓冲的和无缓冲channel
有缓冲的channel和无缓冲的channel_wx6360867ce0633的技术博客_51CTO博客
无缓冲的chan要求是从发送方拿到的东西立刻给接收方,不得延误,所以实时性高(同步)。
有缓冲的chan对会先放到缓冲里, 缓冲填满后再发送,稳定但是实时性低。
4.判断nil
接口有类型和实值两种,只有类型和实际值都是nil,接口变量才等于nil。
一般类型不会有值和类型不一致,只需值为nil即可算成nil。
5.select语句特性
Go 语言 select 语句 | 菜鸟教程 (runoob.com)
select 是 Go 中的一个控制结构,类似于 switch 语句。
select 语句只能用于通道操作,每个 case 必须是一个通道操作,要么是发送要么是接收。
select 语句会监听所有指定的通道上的操作,一旦其中一个通道准备好就会执行相应的代码块。
如果多个通道都准备好,那么 select 语句会随机选择一个通道执行。如果所有通道都没有准备好,那么执行 default 块中的代码。
6包package定义
包(pkg)是 Go ⼯作区中包含 Go 源⽂件或其他包的⽬录。源⽂件中的每个函数、变量和类型都存储在链接包中。每个 Go 源⽂件都属于⼀个包
7.字符串拼接
8.字符串转成byte数组,会发⽣内存拷⻉吗?
golang面试题:字符串转成byte数组,会发生内存拷贝吗? (qq.com)
一般强转都会拷贝,除非调用unsafe包的方法
9.拷⻉⼤切⽚⼀定⽐⼩切⽚代价⼤吗
一样,因为slice的结构都是两个int一个uintptr指针
10.json包变量不加tag会怎么样
有tag用tag,没有就按原来的。小写私有字段会忽略序列化。
11.reflect(反射包)如何获取字段tag?为什么json包不能导出私有变量的tag
可以用reflect获取其type,然后调用get(json)获取其json标签,见链接
golang面试题:reflect(反射包)如何获取字段tag?为什么json包不能导出私有变量的tag? (qq.com)
12.for range的循环次数
昨天那个在for循环里append元素的同事,今天还在么? (qq.com)
次数取决于开始循环时候的len,之后不会重新计算,所以不会因为遍历目标长度改变而死循环。
for i ,len(s),i++ 这种每次都重新计算len所以可能死循环。
因此for range适合与读取正在push和pop的管道。
13.struct比较
相同类型的可以比较,不同类型不可比。
相同类型中字段如有不能比较的,结构体也不能比较。
只有同类型且字段都可以比较的结构体才可以
Go | struct 的比较_如何比较两个struct相不相等_CnPeng的博客-CSDN博客
14.显示类型转换
15.协程Goroutine和线程区别
从调度上看,goroutine的调度开销远远⼩于线程调度开销。
OS的线程由OS内核调度,每隔⼏毫秒,⼀个硬件时钟中断发到CPU,CPU调⽤⼀个调度器内核函数。这个函数暂停当前正在运⾏的线程,把他的寄存器信息保存到内存中,查看线程列表并决定接下来运⾏哪⼀个线程,再从内存中恢复线程的注册表信息,最后继续执⾏选中的线程。这种线程切换需要⼀个完整的上下⽂切换:即保存⼀个线程的状态到内存,再恢复另外⼀个线程的状态,最后更新调度器的数据结构。某种意义上,这种操作还是很慢的。Go运⾏的时候包涵⼀个⾃⼰的调度器,这个调度器使⽤⼀个称为⼀个M:N调度技术,m个goroutine到n个os线程(可以⽤GOMAXPROCS来控制n的数量),Go的调度器不是由硬件时钟来定期触发的,⽽是由特定的go语⾔结构来触发的,他不需要切换到内核语境,所以调度⼀个goroutine⽐调度⼀个线程的成本低很多。从栈空间上,goroutine的栈空间更加动态灵活。每个OS的线程都有⼀个固定⼤⼩的栈内存,通常是2MB,栈内存⽤于保存在其他函数调⽤期间哪些正在执⾏或者临时暂停的函数的局部变量。这个固定的栈⼤⼩,如果对于goroutine来说,可能是⼀种巨⼤的浪费。作为对⽐goroutine在⽣命周期开始只有⼀个很⼩的栈,典型情况是2KB, 在go程序中,⼀次创建⼗万左右的goroutine也不罕⻅(2KB*100,000=200MB)。⽽且goroutine的栈不是固定⼤⼩,它可以按需增⼤和缩⼩,最⼤限制可以到1GB。
goroutine没有⼀个特定的标识。
在⼤部分⽀持多线程的操作系统和编程语⾔中,线程有⼀个独特的标识,通常是⼀个整数或者指针,这个特性可以让我们构建⼀个线程的局部存储,本质是⼀个全局的map,以线程的标识作为键,这样每个线程可以独⽴使⽤这个map存储和获取值,不受其他线程⼲扰。
goroutine中没有可供程序员访问的标识,原因是⼀种纯函数的理念,不希望滥⽤线程局部存储导致⼀个不健康的超距作⽤,即函数的⾏为不仅取决于它的参数,还取决于运⾏它的线程标识。
16.切片比较
第二行不知为何对,待解惑
我猜是先进行类型比较然后再进行内容比较,类型不一样直接false了?
go的比较_go 比较_~kiss~的博客-CSDN博客
Go 学习笔记(89) — 接口类型变量的等值比较操作(nil 接口变量、空接口类型变量、非空接口类型变量)_golang 动态类型 是否为nil_wohu007的博客-CSDN博客