网站首页 > 博客文章 正文
go一千零一问是对go学习、面试相关问题进行总结梳理以及原理剖析,是一个正在积累的系列。一千零一问并不是真的1001个问题而是一个概数。
1.make和new的区别
- make 只能初始化go内置的数据结构:slice, map, chan,并且返回的就是类型本身而不是指针。
- new根据传入的类型分配内存空间且初始化零值,并返回指向这片内存空间的指针。
共同点:都能分配内存。
区别:make只能作用于go内置的slice,map,chan三种类型且返回的类型就是传递进去的类型本身。new可以作用于任意类型且返回类型是指针(指针指向分配的内存空间),初始化了对应类型的零值。
为什么make不返回指针?
因为go内置类型slice,map,chan本身就是引用类型,内置结构其实有指针,所以并不需要返回指针。
2.函数调用需要传入结构体时,传指针还是值?怎么区分什么时候用哪种?
首先,go里面没有引用类型,所有的函数传递都是值传递,但是像slice,map,channel由于其内置结构里存在指针,因此传递以上类型会被修改原先数据。
- 传值情况:不想改变原来数据,只需要数据进行使用。
- 传指针情况:想要改变原来数据 或者 想要高效率,则传递指针更高效。
3. nil切片(nil slice)和空切片(empty slice)有什么不同?
由于slice内置结构存在指针,因此不同的是指针是否被开辟空间。
- nil slice 完全就是空未被初始化,内置指针数组未开辟空间,则 nil slice == nil 成立
- empty slice 可以理解为空数据,已经开辟内存空间,内置指针数组已经开辟空间有指向内存地址,empty slice == nil 不成立,判空需要用 len(empty slice) == 0
// slice 内置结构
type slice struct {
array unsafe.Pointer
len int
cap int
}
4. 数组和slice切片有什么不同?
详情可以参考文章go的『slice』和『数组[]』区别、常见错误分析
- 数组:数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。
- slice:Slice(切片)代表变长的序列,序列中每个元素都有相同的类型。一个slice类型一般写作 []T,其中T代表slice中元素的类型;slice的语法和数组很像,只是没有固定长度而已。
- 区别对比
最大区别:slice长度可变
5. nil map和空map 有何不同?
nil map和空map基本一致,在操作上又不同
- 都可以读取值,但是都是空值
- 空map可以赋值,nil map不可以
- 虽然都是空的,但是也可以使用delete进行删除操作(早期的go不支持nil map的删除)
6. map可以遍历删除吗?
map是支持一边遍历一边删除的
7. 怎么判断map是否有(存在)值?
// 创建空map
m := map[string]int{}
value, ok := m["1"]
// 此处 ok 是判断是否存在值,次数不存在因此 ok 为false。value获取到对应类型的默认零值,此处为0
7. 如何停止一个正在运行的goroutine?
传入一个信号channel即可,一般传入context,也可以根据需要传递不同的channel。
go func() {
for {
select {
case <-ctx.Done:
return
case <-quit:
return
default:
// …
}
}
}()
8. 如何判断一个channel已经关闭?
ch := make(chan int)
close(ch)
value, isClose := <-chan
// 此处 isClose 将获取到channel是否关闭的状态,此处已经关闭因此获取到的是false
// 可以从已经关闭的channel获取到值,是对应类型的默认零值
9. 使用 channel 的一些注意事项
- 使用完要及时关闭,即 close(channel)
- 不能向已经关闭的channel写数据,会panic
- 可以从已经关闭的channel读取数据,但是读取到的是对应类型的零值
10. select 用过吗?一般用来做什么?
go的 select 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作每个case语句里必须是一个IO操作,确切地说,应该是一个面向channel的IO操作。
select {
case <-ch:
// ...
}
结尾
go一千零一问是一个正在积累的系列,旨在提供go学习相关、go面试、go原理解析以及go相关库等使用。希望大家多多支持多多点赞和分享,让go一千零一问可以更加丰富!
本期针对go基础部分10个面试题先进行了讲解,第二期继续对go基础部分面试题进行讲解。
猜你喜欢
- 2024-10-03 关于go语言中的协程相关知识点总结(三)
- 2024-10-03 详解MS SQL日常维护管理脚本--第二部分
- 2024-10-03 go语言goroutine调度原理以及channel详解
- 2024-10-03 SQL SERVER:索引概述及创建与使用(41)
- 2024-10-03 SQL Server 联接概述(sqlserver连接工具有哪些)
- 2024-10-03 从OOM的角度,带你了解虚拟内存机制
- 2024-10-03 golang开发:select多路选择(golang elseif)
- 2024-10-03 从0开始学Golang编程-基础语法(golang语言基础)
- 2024-10-03 非阻塞的Go channel(非阻塞的症状)
- 2024-10-03 数据库加锁原理举例说明(数据库加锁解锁)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- googlecloud (64)
- messagesource (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)