1.make和new的区别go一千零一问是对go学习、面试相关问题进行总结梳理以及原理剖析,是一个正在积累的系列。一千零一问并不是真的1001个问题而是一个概数。
make 只能初始化go内置的数据结构:slice, map, chan,并且返回的就是类型本身而不是指针。
new根据传入的类型分配内存空间且初始化零值,并返回指向这片内存空间的指针。
共同点:都能分配内存。
区别:make只能作用于go内置的slice,map,chan三种类型且返回的类型就是传递进去的类型本身。new可以作用于任意类型且返回类型是指针(指针指向分配的内存空间),初始化了对应类型的零值。
为什么make不返回指针?
因为go内置类型slice,map,chan本身就是引用类型,内置结构其实有指针,所以并不需要返回指针。
2.函数调用需要传入结构体时,传指针还是值?怎么区分什么时候用哪种?首先,go里面没有引用类型,所有的函数传递都是值传递,但是像slice,map,channel由于其内置结构里存在指针,因此传递以上类型会被修改原先数据。
传值情况:不想改变原来数据,只需要数据进行使用。
传指针情况:想要改变原来数据 或者 想要高效率,则传递指针更高效。
由于slice内置结构存在指针,因此不同的是指针是否被开辟空间。
nil slice 完全就是空未被初始化,内置指针数组未开辟空间,则 nil slice == nil 成立
empty slice 可以理解为空数据,已经开辟内存空间,内置指针数组已经开辟空间有指向内存地址,empty slice == nil 不成立,判空需要用 len(empty slice) == 0
详情可以参考文章go的『slice』和『数组[]』区别、常见错误分析
数组:数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。
slice:Slice(切片)代表变长的序列,序列中每个元素都有相同的类型。一个slice类型一般写作 []T,其中T代表slice中元素的类型;slice的语法和数组很像,只是没有固定长度而已。
区别对比
最大区别:slice长度可变
nil map和空map基本一致,在操作上又不同
都可以读取值,但是都是空值
空map可以赋值,nil map不可以
虽然都是空的,但是也可以使用delete进行删除操作(早期的go不支持nil map的删除)
7. 如何停止一个正在运行的goroutine?
传入一个信号channel即可,一般传入context,也可以根据需要传递不同的channel。
8. 如何判断一个channel已经关闭?
9. 使用 channel 的一些注意事项
使用完要及时关闭,即 close(channel)
不能向已经关闭的channel写数据,会panic
可以从已经关闭的channel读取数据,但是读取到的是对应类型的零值
go的 select 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作每个case语句里必须是一个IO操作,确切地说,应该是一个面向channel的IO操作。
结尾
go一千零一问是一个正在积累的系列,旨在提供go学习相关、go面试、go原理解析以及go相关库等使用。希望大家多多支持多多点赞和分享,让go一千零一问可以更加丰富!
本期针对go基础部分10个面试题先进行了讲解,第二期继续对go基础部分面试题进行讲解。