成为Go开发工作者已经2个多月了, 是时候通过一些面试题笔试题提升自己了
结构体是否可以直接寻地址
什么叫可寻址
可直接使用
&
操作符取地址的对象,就是可寻址
哪些是可以寻址的
变量 &x
1 | name := "caoxl" |
指针 &*x
1 | package main |
数组元素索引 &a[0]
1 | a := [3]int{1, 2, 3} |
切片
1 | fmt.Println([]int{1, 2, 3}[1:]) |
切片元素索引 &s[0]
1 | s := []int{1, 2, 3} |
哪些是不可以寻址的
常量
字符串
函数或方法
有方向的channel是否可以关闭
因为关闭操作只用于断言不再向channel发送新的数据,所以只有在发送者所在的goroutine才会调用close函数,因此对一个只接收的channel调用close将是一个编译错误。
for range和for对channel遍历的区别
for range 中,参与循环表达式的只是对象的副本
context超时控制
利用 context.WithTimeout()
方法会返回一个具有超时功能的上下文。
cron定时
1 | package main |
embed包的作用
embed是在Go 1.16中新加入的包。它通过//go:embed
指令,可以在编译阶段将静态资源文件打包进编译好的程序中,并提供访问这些文件的能力。
为什么需要 embed 包
在以前,很多从其他语言转过来Go语言的同学会问到,或者踩到一个坑。就是以为Go语言所打包的二进制文件中会包含配置文件的联同编译和打包。
结果往往一把二进制文件挪来挪去,就无法把应用程序运行起来了。因为无法读取到静态文件的资源。
哪些类型可以和nil比较
nil是一个预先声明的标识符,代表指针(pointer)、通道(channel)、函数(func)、接口(interface)、map、切片(slice)。也可以这么理解:指针、通道、函数、接口、map、切片的零值就是nil,就像布尔类型的零值是false、整型的零值是0。
nil标识符的比较
1 | fmt.Println(nil== nil) |
==符号对于nil来说是一种未定义的操作,所以是不可以比较两个nil的
nil的值比较
1 | func main() { |
- 运行结果
1 | # command-line-arguments |
从运行结果我们可以看出,指针类型nil
、channel类型的nil
、interface类型
可以相互比较,而func类型
、map类型
、slice类型
只能与nil标识符
比较,两个类型相互比较是不合法的。
fallthrouth是否可以用在断言
fallthrouth
fallthrough:Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch, 但是可以使用fallthrough强制执行后面的case代码。
断言
类型断言(Type Assertion)是一个使用在接口值上的操作,用于检查接口类型变量所持有的值是否实现了期望的接口或者具体的类型。
断言还有一种形式,就是使用「switch语句」判断接口的类型