开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情
今天来学习下Go常见的习题问题(十四),也是面试中可能会遇到的,让我们来一起学习吧~
无缓冲和有缓冲
观察下列代码,关于Channel说法正确的是?
- A. 无缓冲的channel是默认的缓冲为1的channel
- B. 无缓冲的channel和有缓冲的channel都是同步的
- C. 无缓冲的channel和有缓冲的channel都是非同步的
- D. 无缓冲的channel是同步的,而有缓冲的channel是非同步的
参考答案:选择D,缓冲大小设置为0或者不设置,channel为无缓冲类型,通信成功的前提是发送者和接收者都处于就绪状态,所以无缓冲channel是同步的,因为发送者会阻塞直到接收者接收了发送的值。有缓冲的channel顾名思义就是往channel发送消息,不用管接收者是否收到,如果消息达到最大的缓冲值就会被阻塞
大括号
观察下列代码,判断是否能通过编译?
func main()
{
fmt.Println("YYQQ Hello")
}
参考答案:不能通过编译,unexpected semicolon or newline before,因为go语言中大括号不能单独放在一行,需要将第一个括号放到main()后面
切片初始化
观察下列代码,判断输出结果是什么?
var x = []int{2: 4, 3, 0: 7}
func main() {
fmt.Println(x)
}
参考答案:输出7,0,4,3,可以通过指定索引来初始化切片,没有指定索引的元素会在前一个索引基础之上加一,上述例子中元素3就是填在索引2的基础上加一的位置
指针
观察下列代码,判断输出结果是什么?
func incr(p *int) int {
*p++
return *p
}
func main() {
v := 5
incr(&v)
fmt.Println(v)
}
参考答案:输出6,因为变量p是指针变量,指向变量v,*p++操作的意思是取出变量 v 的值并进行加一的操作,所以变量v的值会变成2。
总结
今天浅谈了Go的习题(十四),主要介绍了GO面试中会出现的问题,接下来会继续分享其他的习题的相关知识,对于一个刚入门的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!